@rainhole/rain-code 1.1.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 (496) hide show
  1. package/README.md +172 -0
  2. package/dist/chunk-06b2745w.js +3583 -0
  3. package/dist/chunk-06saje2v.js +39 -0
  4. package/dist/chunk-07069jq1.js +30 -0
  5. package/dist/chunk-0731m51q.js +8 -0
  6. package/dist/chunk-0bs2528v.js +192 -0
  7. package/dist/chunk-0fj1d707.js +313 -0
  8. package/dist/chunk-0gdkvtx4.js +117 -0
  9. package/dist/chunk-0jd8rpt4.js +34257 -0
  10. package/dist/chunk-0paqc2yw.js +15 -0
  11. package/dist/chunk-0pk0w4j1.js +332 -0
  12. package/dist/chunk-0rpb2bdp.js +8 -0
  13. package/dist/chunk-0rvwew67.js +9300 -0
  14. package/dist/chunk-0sa1g8jf.js +318 -0
  15. package/dist/chunk-0vkfrmqm.js +690 -0
  16. package/dist/chunk-0xgxxqhr.js +708 -0
  17. package/dist/chunk-0xjaqda8.js +1124 -0
  18. package/dist/chunk-0zep39v0.js +81 -0
  19. package/dist/chunk-1141xmr4.js +8 -0
  20. package/dist/chunk-12hn2mhy.js +17 -0
  21. package/dist/chunk-12rjry89.js +81 -0
  22. package/dist/chunk-168xb8v1.js +436 -0
  23. package/dist/chunk-1cwdhk7a.js +969 -0
  24. package/dist/chunk-1cx0fd76.js +132 -0
  25. package/dist/chunk-1erfksyp.js +107 -0
  26. package/dist/chunk-1h1tc4mw.js +126 -0
  27. package/dist/chunk-1h2famwb.js +49 -0
  28. package/dist/chunk-1jnbys9f.js +1811 -0
  29. package/dist/chunk-1k4fp6ft.js +389 -0
  30. package/dist/chunk-1mjn8xxc.js +22 -0
  31. package/dist/chunk-1mn6r4y2.js +747 -0
  32. package/dist/chunk-1p8myfza.js +1568 -0
  33. package/dist/chunk-1vthytca.js +79 -0
  34. package/dist/chunk-1y32rx73.js +145 -0
  35. package/dist/chunk-200781fd.js +64 -0
  36. package/dist/chunk-205mmm67.js +100 -0
  37. package/dist/chunk-209eh6ak.js +9381 -0
  38. package/dist/chunk-21mfpnva.js +85 -0
  39. package/dist/chunk-238g70xa.js +36 -0
  40. package/dist/chunk-24k6t9fa.js +151 -0
  41. package/dist/chunk-29gg6hx0.js +2992 -0
  42. package/dist/chunk-2a42s11t.js +412 -0
  43. package/dist/chunk-2ekjxh7d.js +289 -0
  44. package/dist/chunk-2eykm0j0.js +20 -0
  45. package/dist/chunk-2fwze72g.js +24 -0
  46. package/dist/chunk-2gzv8nrw.js +205 -0
  47. package/dist/chunk-2k995y2x.js +880 -0
  48. package/dist/chunk-2nayx6q1.js +63 -0
  49. package/dist/chunk-2pg9pmvc.js +182 -0
  50. package/dist/chunk-2qp2hc02.js +36 -0
  51. package/dist/chunk-2rj0dnps.js +436 -0
  52. package/dist/chunk-2t0xa4dt.js +145 -0
  53. package/dist/chunk-2ym6tnww.js +216 -0
  54. package/dist/chunk-30bpz5m2.js +34 -0
  55. package/dist/chunk-30rst83v.js +168 -0
  56. package/dist/chunk-36b2q5fg.js +1299 -0
  57. package/dist/chunk-3c25bcsw.js +17 -0
  58. package/dist/chunk-3ewzhjyb.js +207 -0
  59. package/dist/chunk-3h8a89gy.js +46 -0
  60. package/dist/chunk-3nk79af8.js +8 -0
  61. package/dist/chunk-3sfr7j85.js +884 -0
  62. package/dist/chunk-3w6s9m5w.js +16 -0
  63. package/dist/chunk-3x52v1wb.js +660 -0
  64. package/dist/chunk-404qm8xt.js +1715 -0
  65. package/dist/chunk-42fjay4q.js +141 -0
  66. package/dist/chunk-48649h96.js +8590 -0
  67. package/dist/chunk-495d85x1.js +8066 -0
  68. package/dist/chunk-4anj5saq.js +111 -0
  69. package/dist/chunk-4asynmj4.js +259 -0
  70. package/dist/chunk-4ck9wve9.js +225 -0
  71. package/dist/chunk-4cp6193g.js +9076 -0
  72. package/dist/chunk-4g3v8y12.js +23 -0
  73. package/dist/chunk-4geyher8.js +244 -0
  74. package/dist/chunk-4hv90qcz.js +8 -0
  75. package/dist/chunk-4jhr03e7.js +61 -0
  76. package/dist/chunk-4jm600zv.js +13 -0
  77. package/dist/chunk-4nspekjp.js +69 -0
  78. package/dist/chunk-4ptqcw4p.js +16 -0
  79. package/dist/chunk-4qj8cqbh.js +173 -0
  80. package/dist/chunk-4wxsg6a0.js +122 -0
  81. package/dist/chunk-4zfkzkt6.js +37 -0
  82. package/dist/chunk-54dckh8a.js +1169 -0
  83. package/dist/chunk-54y13759.js +650 -0
  84. package/dist/chunk-54yf6e8d.js +91 -0
  85. package/dist/chunk-57qz90z8.js +154 -0
  86. package/dist/chunk-59k0mjnc.js +120 -0
  87. package/dist/chunk-59p9jye4.js +104 -0
  88. package/dist/chunk-5c753bd4.js +64 -0
  89. package/dist/chunk-5cw6zwep.js +106 -0
  90. package/dist/chunk-5eaf3j24.js +133 -0
  91. package/dist/chunk-5me7398b.js +81 -0
  92. package/dist/chunk-5pevjsyw.js +118 -0
  93. package/dist/chunk-5q3c2rf4.js +107 -0
  94. package/dist/chunk-5xwtnq4g.js +146 -0
  95. package/dist/chunk-5z28bqne.js +6748 -0
  96. package/dist/chunk-613f6fbv.js +63 -0
  97. package/dist/chunk-641hawvm.js +95 -0
  98. package/dist/chunk-64c1avct.js +13 -0
  99. package/dist/chunk-64hks9ax.js +456 -0
  100. package/dist/chunk-677as3nh.js +15 -0
  101. package/dist/chunk-6bd8brc4.js +48 -0
  102. package/dist/chunk-6cs6mmez.js +112 -0
  103. package/dist/chunk-6dj5t602.js +341 -0
  104. package/dist/chunk-6e8vht4y.js +780 -0
  105. package/dist/chunk-6gr3c3w9.js +378 -0
  106. package/dist/chunk-6hkd32eh.js +83 -0
  107. package/dist/chunk-6jqxvef0.js +198 -0
  108. package/dist/chunk-6mh3vfa4.js +115 -0
  109. package/dist/chunk-6mpw9h55.js +1071 -0
  110. package/dist/chunk-6p4cyhb3.js +16 -0
  111. package/dist/chunk-6qvgnepd.js +26 -0
  112. package/dist/chunk-6r2bhsvt.js +6956 -0
  113. package/dist/chunk-6tq2v3rk.js +186 -0
  114. package/dist/chunk-7316m01k.js +125 -0
  115. package/dist/chunk-73rpbt04.js +1947 -0
  116. package/dist/chunk-75zk7zr1.js +309 -0
  117. package/dist/chunk-760252na.js +101 -0
  118. package/dist/chunk-764ec4ja.js +173 -0
  119. package/dist/chunk-76vgnv24.js +108 -0
  120. package/dist/chunk-7739pg2c.js +4261 -0
  121. package/dist/chunk-7a7hxy3d.js +167 -0
  122. package/dist/chunk-7aw745vx.js +40175 -0
  123. package/dist/chunk-7b6bg1r4.js +16128 -0
  124. package/dist/chunk-7ca4qskp.js +99 -0
  125. package/dist/chunk-7deph26x.js +311 -0
  126. package/dist/chunk-7ds8zqar.js +108 -0
  127. package/dist/chunk-7fqxw3d2.js +479 -0
  128. package/dist/chunk-7nysf9yd.js +266 -0
  129. package/dist/chunk-7tascxe2.js +90 -0
  130. package/dist/chunk-7wm5s02e.js +216 -0
  131. package/dist/chunk-7xmw2tcz.js +277 -0
  132. package/dist/chunk-7xyswgjh.js +8 -0
  133. package/dist/chunk-7zkhadkb.js +220 -0
  134. package/dist/chunk-8225arm6.js +6374 -0
  135. package/dist/chunk-83hfzbx3.js +10 -0
  136. package/dist/chunk-85tag8nv.js +1391 -0
  137. package/dist/chunk-8bd8q5xw.js +359 -0
  138. package/dist/chunk-8bwqtasa.js +213 -0
  139. package/dist/chunk-8g5pe1gr.js +37 -0
  140. package/dist/chunk-8g747a8x.js +26 -0
  141. package/dist/chunk-8h6sdj66.js +447 -0
  142. package/dist/chunk-8mm8b6dd.js +19 -0
  143. package/dist/chunk-8ndwn6st.js +120 -0
  144. package/dist/chunk-8pn8tvgg.js +637 -0
  145. package/dist/chunk-8tnn9kcb.js +131 -0
  146. package/dist/chunk-8tnsngw2.js +31 -0
  147. package/dist/chunk-8x5w267y.js +112 -0
  148. package/dist/chunk-8y12jxg8.js +10 -0
  149. package/dist/chunk-8ymf4e6z.js +48 -0
  150. package/dist/chunk-90mt0m1w.js +102 -0
  151. package/dist/chunk-90wp6wez.js +10510 -0
  152. package/dist/chunk-91ew1d6f.js +2689 -0
  153. package/dist/chunk-97jsc1kn.js +231 -0
  154. package/dist/chunk-993pnm45.js +4521 -0
  155. package/dist/chunk-9a0rsdre.js +46 -0
  156. package/dist/chunk-9d7fmqkw.js +41 -0
  157. package/dist/chunk-9dgaq0g4.js +667 -0
  158. package/dist/chunk-9f52phb8.js +138 -0
  159. package/dist/chunk-9fbpqghc.js +105 -0
  160. package/dist/chunk-9hzxd5q3.js +122 -0
  161. package/dist/chunk-9kyrssch.js +28 -0
  162. package/dist/chunk-9q93n4w6.js +308 -0
  163. package/dist/chunk-9s0xs06y.js +581 -0
  164. package/dist/chunk-9x5zgy22.js +12 -0
  165. package/dist/chunk-9zdcb9jy.js +105 -0
  166. package/dist/chunk-a136cvvz.js +27 -0
  167. package/dist/chunk-a4psxnr1.js +224 -0
  168. package/dist/chunk-a4twdmhf.js +45 -0
  169. package/dist/chunk-a7rhvq9b.js +106 -0
  170. package/dist/chunk-a8ejc632.js +3094 -0
  171. package/dist/chunk-a9vdeb6y.js +258 -0
  172. package/dist/chunk-a9zh40sj.js +48 -0
  173. package/dist/chunk-aawg48hh.js +4102 -0
  174. package/dist/chunk-ad2f3890.js +65 -0
  175. package/dist/chunk-ae7ar1jk.js +105 -0
  176. package/dist/chunk-ak3hdbe4.js +234 -0
  177. package/dist/chunk-as4e9g8f.js +298 -0
  178. package/dist/chunk-ase86y73.js +15 -0
  179. package/dist/chunk-awb4vc41.js +69 -0
  180. package/dist/chunk-b4bep0aq.js +5041 -0
  181. package/dist/chunk-b4wg70y1.js +54 -0
  182. package/dist/chunk-b81hd3m6.js +32 -0
  183. package/dist/chunk-b9knmzt0.js +106 -0
  184. package/dist/chunk-besmz4ym.js +32 -0
  185. package/dist/chunk-bgpkemkg.js +65 -0
  186. package/dist/chunk-bj8x29tz.js +54 -0
  187. package/dist/chunk-bkqsnwrq.js +239 -0
  188. package/dist/chunk-bnf662he.js +359 -0
  189. package/dist/chunk-bq00fcsd.js +165 -0
  190. package/dist/chunk-brz2c4cq.js +275 -0
  191. package/dist/chunk-bsa118r4.js +502 -0
  192. package/dist/chunk-bsengrbt.js +2737 -0
  193. package/dist/chunk-bt64sq5y.js +19 -0
  194. package/dist/chunk-bxcfz5gy.js +56 -0
  195. package/dist/chunk-bxs2a71m.js +213 -0
  196. package/dist/chunk-byv2p9hn.js +397 -0
  197. package/dist/chunk-c03am3es.js +29 -0
  198. package/dist/chunk-c2ahb7yg.js +105 -0
  199. package/dist/chunk-c2qm0t6p.js +111 -0
  200. package/dist/chunk-c42h9gzx.js +71 -0
  201. package/dist/chunk-c47xbxqw.js +38 -0
  202. package/dist/chunk-c5vkve4j.js +68 -0
  203. package/dist/chunk-c6sjhj89.js +1284 -0
  204. package/dist/chunk-ca147npg.js +27 -0
  205. package/dist/chunk-caxx597g.js +71 -0
  206. package/dist/chunk-cbrt5vsb.js +31 -0
  207. package/dist/chunk-ce0z23ct.js +443 -0
  208. package/dist/chunk-cefsp8h1.js +155 -0
  209. package/dist/chunk-cfv996bs.js +22 -0
  210. package/dist/chunk-cgfdkzhb.js +12 -0
  211. package/dist/chunk-chsyvavm.js +3435 -0
  212. package/dist/chunk-cmsknj6n.js +28228 -0
  213. package/dist/chunk-cn8bkmvj.js +264 -0
  214. package/dist/chunk-crmjpsqe.js +68 -0
  215. package/dist/chunk-cthpw4pj.js +849 -0
  216. package/dist/chunk-cwy9nj4y.js +134 -0
  217. package/dist/chunk-cyagce56.js +155 -0
  218. package/dist/chunk-cynewytp.js +227 -0
  219. package/dist/chunk-cznf6k4g.js +46 -0
  220. package/dist/chunk-d0954t9j.js +267 -0
  221. package/dist/chunk-d1qhftze.js +118 -0
  222. package/dist/chunk-d4mdda98.js +94 -0
  223. package/dist/chunk-d4rnqevg.js +41 -0
  224. package/dist/chunk-d7886r6a.js +13870 -0
  225. package/dist/chunk-dd1qvamk.js +678 -0
  226. package/dist/chunk-dg4je8qj.js +183 -0
  227. package/dist/chunk-dggvswz1.js +104 -0
  228. package/dist/chunk-dgqrcy74.js +48 -0
  229. package/dist/chunk-dm3n2qgd.js +24 -0
  230. package/dist/chunk-dnh7jtpb.js +37 -0
  231. package/dist/chunk-dsenyfax.js +105 -0
  232. package/dist/chunk-dtf0a7rr.js +655 -0
  233. package/dist/chunk-dxdb7bs1.js +60 -0
  234. package/dist/chunk-e0pth8g7.js +79 -0
  235. package/dist/chunk-e36y0q82.js +109 -0
  236. package/dist/chunk-ef55cwrv.js +267 -0
  237. package/dist/chunk-efh644hv.js +915 -0
  238. package/dist/chunk-ehtwnxpg.js +1591 -0
  239. package/dist/chunk-ejahyhd8.js +120 -0
  240. package/dist/chunk-ejk1bpzz.js +472 -0
  241. package/dist/chunk-emef71ea.js +202 -0
  242. package/dist/chunk-en7v028t.js +333 -0
  243. package/dist/chunk-eqp1rfft.js +17 -0
  244. package/dist/chunk-ewadzrm8.js +103 -0
  245. package/dist/chunk-exh7z6tv.js +132 -0
  246. package/dist/chunk-f0npbgyf.js +340 -0
  247. package/dist/chunk-f2qkc8ce.js +229 -0
  248. package/dist/chunk-f49sb3q7.js +40 -0
  249. package/dist/chunk-f5ma3nh5.js +3436 -0
  250. package/dist/chunk-fbv4apne.js +51 -0
  251. package/dist/chunk-fday7sfg.js +269 -0
  252. package/dist/chunk-feyzykye.js +10 -0
  253. package/dist/chunk-fgqwr70t.js +241 -0
  254. package/dist/chunk-fhy7zs1w.js +943 -0
  255. package/dist/chunk-fmw3f68k.js +432 -0
  256. package/dist/chunk-fmwqvpqm.js +506 -0
  257. package/dist/chunk-fn1apgre.js +66 -0
  258. package/dist/chunk-fpy4nam9.js +21933 -0
  259. package/dist/chunk-fqy0erkw.js +908 -0
  260. package/dist/chunk-ftqwza3a.js +43 -0
  261. package/dist/chunk-fyc5fepv.js +10 -0
  262. package/dist/chunk-fz0ch109.js +329 -0
  263. package/dist/chunk-fzhn8z8j.js +253 -0
  264. package/dist/chunk-g12brv6y.js +321 -0
  265. package/dist/chunk-g338npwr.js +1061 -0
  266. package/dist/chunk-g5tpks28.js +795 -0
  267. package/dist/chunk-g63tgj4f.js +58 -0
  268. package/dist/chunk-g827r0mk.js +266 -0
  269. package/dist/chunk-g8wzsxgc.js +2534 -0
  270. package/dist/chunk-gey7mwcw.js +36 -0
  271. package/dist/chunk-gghb9pks.js +120 -0
  272. package/dist/chunk-grdpaf1p.js +606 -0
  273. package/dist/chunk-gx8016vp.js +125 -0
  274. package/dist/chunk-h0qngp9w.js +157 -0
  275. package/dist/chunk-h0rbjg6x.js +55 -0
  276. package/dist/chunk-h1mr3371.js +121 -0
  277. package/dist/chunk-h3xwdgpd.js +68 -0
  278. package/dist/chunk-h4b85amj.js +2331 -0
  279. package/dist/chunk-h6d137aa.js +20 -0
  280. package/dist/chunk-h9n7z00d.js +95 -0
  281. package/dist/chunk-hakdhagh.js +16606 -0
  282. package/dist/chunk-hd8531ec.js +685 -0
  283. package/dist/chunk-heq3rn8t.js +33068 -0
  284. package/dist/chunk-hfvxc9fd.js +542 -0
  285. package/dist/chunk-hgpd0qmm.js +371 -0
  286. package/dist/chunk-hh7cmy4k.js +20 -0
  287. package/dist/chunk-hhjs87wh.js +1407 -0
  288. package/dist/chunk-hjtvdvgj.js +208 -0
  289. package/dist/chunk-hk9xz7gk.js +118 -0
  290. package/dist/chunk-hknbjky3.js +160798 -0
  291. package/dist/chunk-htsbqyf9.js +338 -0
  292. package/dist/chunk-htx7jmxk.js +78 -0
  293. package/dist/chunk-hzhe8ygc.js +547 -0
  294. package/dist/chunk-j2k4p94p.js +55 -0
  295. package/dist/chunk-j3a4p81y.js +184 -0
  296. package/dist/chunk-j46rb9m9.js +544 -0
  297. package/dist/chunk-j5bth84e.js +97 -0
  298. package/dist/chunk-j64ga6ta.js +8035 -0
  299. package/dist/chunk-j6jh72hw.js +140 -0
  300. package/dist/chunk-j9gxwbe3.js +349 -0
  301. package/dist/chunk-jaaxk89e.js +113 -0
  302. package/dist/chunk-jd32zbps.js +15 -0
  303. package/dist/chunk-jdgeec04.js +4249 -0
  304. package/dist/chunk-jk826edv.js +174 -0
  305. package/dist/chunk-jnhkref0.js +30 -0
  306. package/dist/chunk-jsx72hep.js +208 -0
  307. package/dist/chunk-jx817w05.js +11 -0
  308. package/dist/chunk-jzmz18nn.js +65 -0
  309. package/dist/chunk-k0p9w03v.js +4957 -0
  310. package/dist/chunk-k3s4yk22.js +477 -0
  311. package/dist/chunk-kfd89dsd.js +21 -0
  312. package/dist/chunk-kgfz4522.js +126 -0
  313. package/dist/chunk-kn6zg6bd.js +524 -0
  314. package/dist/chunk-kp9vkzj6.js +120 -0
  315. package/dist/chunk-kraf793v.js +118 -0
  316. package/dist/chunk-kw0r30h3.js +208 -0
  317. package/dist/chunk-kwekc97v.js +18 -0
  318. package/dist/chunk-m2bcpk8j.js +30 -0
  319. package/dist/chunk-m2kp5f7p.js +4389 -0
  320. package/dist/chunk-m74w3187.js +164 -0
  321. package/dist/chunk-m88q4jmb.js +61 -0
  322. package/dist/chunk-man6wb4n.js +1456 -0
  323. package/dist/chunk-mdk3xgya.js +42 -0
  324. package/dist/chunk-mf4g439x.js +82 -0
  325. package/dist/chunk-mg8g0xqs.js +71 -0
  326. package/dist/chunk-mkwzrqvf.js +38 -0
  327. package/dist/chunk-mn61mk4v.js +351 -0
  328. package/dist/chunk-ms09sxcj.js +908 -0
  329. package/dist/chunk-mtn1anwe.js +2351 -0
  330. package/dist/chunk-mv0zm0qj.js +65 -0
  331. package/dist/chunk-mx28h61f.js +1147 -0
  332. package/dist/chunk-mxbf8ajn.js +1067 -0
  333. package/dist/chunk-n0qaeaa5.js +256 -0
  334. package/dist/chunk-n34z5cw8.js +74 -0
  335. package/dist/chunk-n55ehz77.js +120 -0
  336. package/dist/chunk-n7ttdtk0.js +641 -0
  337. package/dist/chunk-n9ktjngj.js +336 -0
  338. package/dist/chunk-nb2ntesh.js +149 -0
  339. package/dist/chunk-netzwgv1.js +154 -0
  340. package/dist/chunk-nh3cd07f.js +14358 -0
  341. package/dist/chunk-nka1g8f4.js +773 -0
  342. package/dist/chunk-nm97cw83.js +458 -0
  343. package/dist/chunk-nq0fxyxh.js +752 -0
  344. package/dist/chunk-nt837qt9.js +21 -0
  345. package/dist/chunk-nx87c0vw.js +250 -0
  346. package/dist/chunk-nxw6y6xm.js +862 -0
  347. package/dist/chunk-nzt717xg.js +32 -0
  348. package/dist/chunk-p2816w9z.js +1486 -0
  349. package/dist/chunk-p2d5nh3g.js +342 -0
  350. package/dist/chunk-p9cdykwf.js +72 -0
  351. package/dist/chunk-paxw1ryd.js +227 -0
  352. package/dist/chunk-ph5g4d1j.js +109 -0
  353. package/dist/chunk-pp42p8y3.js +574 -0
  354. package/dist/chunk-ppdn71n4.js +400 -0
  355. package/dist/chunk-ppwjyveh.js +8 -0
  356. package/dist/chunk-ps49ymvj.js +43 -0
  357. package/dist/chunk-pshjyzq4.js +17656 -0
  358. package/dist/chunk-pw8nf9rt.js +126 -0
  359. package/dist/chunk-pwwa7s62.js +11 -0
  360. package/dist/chunk-py3zxq5j.js +129 -0
  361. package/dist/chunk-pyz1qswz.js +300 -0
  362. package/dist/chunk-q50q8mc5.js +157 -0
  363. package/dist/chunk-q7tpyeb3.js +39 -0
  364. package/dist/chunk-q82r31er.js +151 -0
  365. package/dist/chunk-qajrkk97.js +298 -0
  366. package/dist/chunk-qcpxnyeh.js +110 -0
  367. package/dist/chunk-qeabchwr.js +132 -0
  368. package/dist/chunk-qm7nbd10.js +755 -0
  369. package/dist/chunk-qm8j7kxr.js +280 -0
  370. package/dist/chunk-qmwgg5zy.js +136 -0
  371. package/dist/chunk-qnfx3qtx.js +617 -0
  372. package/dist/chunk-qp2qdcda.js +100 -0
  373. package/dist/chunk-qphaajd7.js +305 -0
  374. package/dist/chunk-qt21xxgm.js +419 -0
  375. package/dist/chunk-qy2z2p0b.js +122 -0
  376. package/dist/chunk-qyz8q0dj.js +689 -0
  377. package/dist/chunk-qz2x630m.js +49145 -0
  378. package/dist/chunk-qzq5n1yn.js +76 -0
  379. package/dist/chunk-r0ya57xw.js +170 -0
  380. package/dist/chunk-r7j395t6.js +122 -0
  381. package/dist/chunk-r7trcrs7.js +62 -0
  382. package/dist/chunk-re4yh70t.js +1095 -0
  383. package/dist/chunk-rhte1r8g.js +272 -0
  384. package/dist/chunk-rhw4ayb1.js +6851 -0
  385. package/dist/chunk-rn0v1hk8.js +34 -0
  386. package/dist/chunk-rphakhme.js +281 -0
  387. package/dist/chunk-rrtzz2pv.js +32 -0
  388. package/dist/chunk-rtnjk8ge.js +726 -0
  389. package/dist/chunk-rwhswkma.js +87 -0
  390. package/dist/chunk-rxd4kn2g.js +308 -0
  391. package/dist/chunk-s083x8ry.js +2840 -0
  392. package/dist/chunk-s16sn02n.js +365 -0
  393. package/dist/chunk-s1s8qfdh.js +182 -0
  394. package/dist/chunk-s2bwz69v.js +473 -0
  395. package/dist/chunk-s3pzvdss.js +50 -0
  396. package/dist/chunk-s9y6t0mt.js +291 -0
  397. package/dist/chunk-sd36yzx8.js +954 -0
  398. package/dist/chunk-se8xzw8h.js +87 -0
  399. package/dist/chunk-sg66v252.js +1648 -0
  400. package/dist/chunk-sg7gf3hj.js +1585 -0
  401. package/dist/chunk-spx24x6j.js +98 -0
  402. package/dist/chunk-sybxpy18.js +73 -0
  403. package/dist/chunk-szj5wvdy.js +28 -0
  404. package/dist/chunk-t0gb304x.js +182 -0
  405. package/dist/chunk-t3fr4skc.js +165 -0
  406. package/dist/chunk-t58wfamm.js +5368 -0
  407. package/dist/chunk-t6s2kkm3.js +104 -0
  408. package/dist/chunk-t8hv0x81.js +116 -0
  409. package/dist/chunk-tezak8rx.js +6157 -0
  410. package/dist/chunk-th5y3hj5.js +189 -0
  411. package/dist/chunk-tj0d3870.js +180 -0
  412. package/dist/chunk-tjgsawpx.js +40 -0
  413. package/dist/chunk-ts2p6bv1.js +224 -0
  414. package/dist/chunk-ttk5dzz8.js +25 -0
  415. package/dist/chunk-tv9pcdnz.js +51 -0
  416. package/dist/chunk-ty99rgvw.js +122 -0
  417. package/dist/chunk-tzgp8av2.js +61 -0
  418. package/dist/chunk-v1kzp02e.js +785 -0
  419. package/dist/chunk-v2c9dq7t.js +275 -0
  420. package/dist/chunk-v3aq3heg.js +620 -0
  421. package/dist/chunk-v78fj8by.js +145 -0
  422. package/dist/chunk-v9smspw2.js +4301 -0
  423. package/dist/chunk-var1et7e.js +66 -0
  424. package/dist/chunk-vchrkvet.js +120 -0
  425. package/dist/chunk-vest0y6x.js +3830 -0
  426. package/dist/chunk-vf5sd1nq.js +12 -0
  427. package/dist/chunk-vf612n57.js +472 -0
  428. package/dist/chunk-vgpy9md6.js +339 -0
  429. package/dist/chunk-vkzt82ry.js +644 -0
  430. package/dist/chunk-vsh80y0c.js +100 -0
  431. package/dist/chunk-vxkdxhyk.js +103 -0
  432. package/dist/chunk-vxt6ywm9.js +485 -0
  433. package/dist/chunk-vyjeh50y.js +2149 -0
  434. package/dist/chunk-vytdzvqs.js +1181 -0
  435. package/dist/chunk-w0qks2ja.js +1030 -0
  436. package/dist/chunk-wfz0qffj.js +3939 -0
  437. package/dist/chunk-wp1568nt.js +828 -0
  438. package/dist/chunk-wpckhx7b.js +66 -0
  439. package/dist/chunk-wpvkvwvc.js +41 -0
  440. package/dist/chunk-ws5d6qs4.js +655 -0
  441. package/dist/chunk-wsnxrrb5.js +986 -0
  442. package/dist/chunk-wyavftcj.js +103 -0
  443. package/dist/chunk-wybh0bvv.js +121 -0
  444. package/dist/chunk-wzpdet3m.js +843 -0
  445. package/dist/chunk-x2dp18yj.js +74 -0
  446. package/dist/chunk-x6r4v44b.js +8 -0
  447. package/dist/chunk-x7r5k0hf.js +423 -0
  448. package/dist/chunk-xahk20z8.js +877 -0
  449. package/dist/chunk-xajwdaxm.js +295 -0
  450. package/dist/chunk-xkt36p6r.js +61 -0
  451. package/dist/chunk-xnav6j8h.js +490 -0
  452. package/dist/chunk-xrj294jg.js +440 -0
  453. package/dist/chunk-xsq9ae7x.js +90 -0
  454. package/dist/chunk-xt9z9t7b.js +40 -0
  455. package/dist/chunk-xv3era3s.js +8 -0
  456. package/dist/chunk-y1784krc.js +19 -0
  457. package/dist/chunk-y289fz8y.js +116 -0
  458. package/dist/chunk-y3r7v9pq.js +336 -0
  459. package/dist/chunk-y98z50mm.js +158 -0
  460. package/dist/chunk-yhce3x0q.js +64 -0
  461. package/dist/chunk-yhhf6n9p.js +338 -0
  462. package/dist/chunk-ykr34msh.js +411 -0
  463. package/dist/chunk-yks9ggzn.js +103 -0
  464. package/dist/chunk-ym5r3jnk.js +2007 -0
  465. package/dist/chunk-ypa349qq.js +148 -0
  466. package/dist/chunk-yzx3mhfd.js +110 -0
  467. package/dist/chunk-z1bs6d7k.js +24 -0
  468. package/dist/chunk-z2dp53wn.js +17 -0
  469. package/dist/chunk-z3k0k30d.js +882 -0
  470. package/dist/chunk-z42cqdtf.js +107 -0
  471. package/dist/chunk-z7asrz6j.js +259 -0
  472. package/dist/chunk-za09fhhh.js +716 -0
  473. package/dist/chunk-zae0t3p4.js +252 -0
  474. package/dist/chunk-zbsw794g.js +259 -0
  475. package/dist/chunk-ze6zvkg6.js +22820 -0
  476. package/dist/chunk-zejm280k.js +39 -0
  477. package/dist/chunk-zk2wsm7d.js +15 -0
  478. package/dist/chunk-znf2b75k.js +113 -0
  479. package/dist/chunk-zqpnvsdz.js +24 -0
  480. package/dist/chunk-zs2gdkj5.js +433 -0
  481. package/dist/chunk-zseb1639.js +37 -0
  482. package/dist/chunk-zsgha506.js +63 -0
  483. package/dist/chunk-zvsfgmq8.js +146 -0
  484. package/dist/chunk-zw5xd7m9.js +160 -0
  485. package/dist/chunk-zzm33q8x.js +8 -0
  486. package/dist/cli.js +97 -0
  487. package/dist/download-ripgrep.js +24821 -0
  488. package/dist/vendor/audio-capture/arm64-darwin/audio-capture.node +0 -0
  489. package/dist/vendor/audio-capture/arm64-linux/audio-capture.node +0 -0
  490. package/dist/vendor/audio-capture/arm64-win32/audio-capture.node +0 -0
  491. package/dist/vendor/audio-capture/x64-darwin/audio-capture.node +0 -0
  492. package/dist/vendor/audio-capture/x64-linux/audio-capture.node +0 -0
  493. package/dist/vendor/audio-capture/x64-win32/audio-capture.node +0 -0
  494. package/package.json +178 -0
  495. package/scripts/download-ripgrep.ts +335 -0
  496. package/scripts/postinstall.cjs +319 -0
@@ -0,0 +1,2689 @@
1
+ // @bun
2
+ import {
3
+ ClaudeMdExternalIncludesDialog,
4
+ init_ClaudeMdExternalIncludesDialog
5
+ } from "./chunk-0gdkvtx4.js";
6
+ import {
7
+ init_bridgeEnabled
8
+ } from "./chunk-f49sb3q7.js";
9
+ import {
10
+ ModelPicker,
11
+ init_ModelPicker,
12
+ init_extraUsage,
13
+ isBilledAsExtraUsage
14
+ } from "./chunk-qt21xxgm.js";
15
+ import {
16
+ ThemePicker,
17
+ init_ThemePicker
18
+ } from "./chunk-cn8bkmvj.js";
19
+ import {
20
+ OverageCreditUpsell,
21
+ init_OverageCreditUpsell,
22
+ isEligibleForOverageCreditGrant
23
+ } from "./chunk-5xwtnq4g.js";
24
+ import {
25
+ SearchBox,
26
+ init_SearchBox
27
+ } from "./chunk-21mfpnva.js";
28
+ import {
29
+ init_useSearchInput,
30
+ useSearchInput
31
+ } from "./chunk-9q93n4w6.js";
32
+ import {
33
+ Tab,
34
+ init_Tabs,
35
+ useTabHeaderFocus
36
+ } from "./chunk-mv0zm0qj.js";
37
+ import {
38
+ init_modalContext,
39
+ useIsInsideModal,
40
+ useModalOrTerminalSize
41
+ } from "./chunk-z1bs6d7k.js";
42
+ import {
43
+ fetchUtilization,
44
+ init_usage
45
+ } from "./chunk-dxdb7bs1.js";
46
+ import {
47
+ ConfigurableShortcutHint,
48
+ DEFAULT_OUTPUT_STYLE_NAME,
49
+ OUTPUT_STYLE_CONFIG,
50
+ Select,
51
+ TextInput,
52
+ buildAPIProviderProperties,
53
+ buildAccountProperties,
54
+ buildIDEProperties,
55
+ buildInstallationDiagnostics,
56
+ buildInstallationHealthDiagnostics,
57
+ buildMcpProperties,
58
+ buildMemoryDiagnostics,
59
+ buildSandboxProperties,
60
+ buildSettingSourcesProperties,
61
+ exports_BriefTool,
62
+ extraUsage,
63
+ formatCost,
64
+ getAllOutputStyles,
65
+ getCurrentSessionTitle,
66
+ getExternalClaudeMdIncludes,
67
+ getHardcodedTeammateModelFallback,
68
+ getMemoryFiles,
69
+ getModelDisplayLabel,
70
+ hasAccessToIDEExtensionDiffFeature,
71
+ hasExternalClaudeMdIncludes,
72
+ init_AppState,
73
+ init_BriefTool,
74
+ init_ConfigurableShortcutHint,
75
+ init_CustomSelect,
76
+ init_TextInput,
77
+ init_claudemd,
78
+ init_cost_tracker,
79
+ init_extra_usage,
80
+ init_fullscreen,
81
+ init_ide,
82
+ init_outputStyles,
83
+ init_permissionSetup,
84
+ init_select,
85
+ init_sessionStorage,
86
+ init_status,
87
+ init_teammateModel,
88
+ init_useTerminalSize,
89
+ isFullscreenEnvEnabled,
90
+ isSupportedTerminal,
91
+ transitionPlanAutoMode,
92
+ useAppState,
93
+ useAppStateStore,
94
+ useSetAppState,
95
+ useTerminalSize
96
+ } from "./chunk-hknbjky3.js";
97
+ import {
98
+ clearCliTeammateModeOverride,
99
+ getCliTeammateModeOverride,
100
+ init_teammateModeSnapshot
101
+ } from "./chunk-613f6fbv.js";
102
+ import {
103
+ init_useExitOnCtrlCDWithKeybindings,
104
+ useExitOnCtrlCDWithKeybindings
105
+ } from "./chunk-75zk7zr1.js";
106
+ import {
107
+ init_useKeybinding,
108
+ useKeybinding,
109
+ useKeybindings
110
+ } from "./chunk-xnav6j8h.js";
111
+ import {
112
+ EXTERNAL_PERMISSION_MODES,
113
+ FAST_MODE_MODEL_DISPLAY,
114
+ clearFastModeCooldown,
115
+ formatAutoUpdaterDisabledReason,
116
+ getAutoUpdaterDisabledReason,
117
+ getCurrentProjectConfig,
118
+ getFastModeModel,
119
+ getFeatureValue_CACHED_MAY_BE_STALE,
120
+ getGlobalConfig,
121
+ getInitialSettings,
122
+ getSettingsForSource,
123
+ getSubscriptionType,
124
+ init_PermissionMode,
125
+ init_agentSwarmsEnabled,
126
+ init_auth,
127
+ init_authPortable,
128
+ init_config1 as init_config,
129
+ init_fastMode,
130
+ init_growthbook,
131
+ init_model,
132
+ init_settings1 as init_settings,
133
+ isAgentSwarmsEnabled,
134
+ isExternalPermissionMode,
135
+ isFastModeAvailable,
136
+ isFastModeEnabled,
137
+ isFastModeSupportedByModel,
138
+ isOpus1mMergeEnabled,
139
+ modelDisplayString,
140
+ normalizeApiKeyForConfig,
141
+ permissionModeFromString,
142
+ permissionModeTitle,
143
+ saveGlobalConfig,
144
+ toExternalPermissionMode,
145
+ updateSettingsForSource
146
+ } from "./chunk-7b6bg1r4.js";
147
+ import {
148
+ formatResetText,
149
+ init_format
150
+ } from "./chunk-64hks9ax.js";
151
+ import {
152
+ Byline,
153
+ Dialog,
154
+ KeyboardShortcutHint,
155
+ Pane,
156
+ ProgressBar,
157
+ Tabs,
158
+ ThemedBox_default,
159
+ ThemedText,
160
+ init_source,
161
+ init_src,
162
+ source_default,
163
+ useTerminalFocus,
164
+ useTheme,
165
+ useThemeSetting
166
+ } from "./chunk-cmsknj6n.js";
167
+ import {
168
+ require_jsx_dev_runtime,
169
+ require_react
170
+ } from "./chunk-g338npwr.js";
171
+ import {
172
+ init_analytics,
173
+ logEvent
174
+ } from "./chunk-h0rbjg6x.js";
175
+ import {
176
+ getCwd,
177
+ init_cwd
178
+ } from "./chunk-b81hd3m6.js";
179
+ import {
180
+ init_log,
181
+ logError
182
+ } from "./chunk-y3r7v9pq.js";
183
+ import {
184
+ figures_default,
185
+ init_figures
186
+ } from "./chunk-qajrkk97.js";
187
+ import {
188
+ init_slowOperations,
189
+ jsonStringify
190
+ } from "./chunk-404qm8xt.js";
191
+ import {
192
+ init_envUtils,
193
+ isEnvTruthy,
194
+ isRunningOnHomespace
195
+ } from "./chunk-jaaxk89e.js";
196
+ import {
197
+ getSessionId,
198
+ getUserMsgOptIn,
199
+ init_state,
200
+ setUserMsgOptIn
201
+ } from "./chunk-h4b85amj.js";
202
+ import {
203
+ __esm,
204
+ __toCommonJS,
205
+ __toESM
206
+ } from "./chunk-qp2qdcda.js";
207
+
208
+ // src/components/Settings/Status.tsx
209
+ function buildPrimarySection() {
210
+ const sessionId = getSessionId();
211
+ const customTitle = getCurrentSessionTitle(sessionId);
212
+ const nameValue = customTitle ?? /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
213
+ dimColor: true,
214
+ children: "/rename to add a name"
215
+ }, undefined, false, undefined, this);
216
+ return [
217
+ { label: "Version", value: "2.1.888" },
218
+ { label: "Session name", value: nameValue },
219
+ { label: "Session ID", value: sessionId },
220
+ { label: "cwd", value: getCwd() },
221
+ ...buildAccountProperties(),
222
+ ...buildAPIProviderProperties()
223
+ ];
224
+ }
225
+ function buildSecondarySection({
226
+ mainLoopModel,
227
+ mcp,
228
+ theme,
229
+ context
230
+ }) {
231
+ const modelLabel = getModelDisplayLabel(mainLoopModel);
232
+ return [
233
+ { label: "Model", value: modelLabel },
234
+ ...buildIDEProperties(mcp.clients, context.options.ideInstallationStatus, theme),
235
+ ...buildMcpProperties(mcp.clients, theme),
236
+ ...buildSandboxProperties(),
237
+ ...buildSettingSourcesProperties()
238
+ ];
239
+ }
240
+ async function buildDiagnostics() {
241
+ return [
242
+ ...await buildInstallationDiagnostics(),
243
+ ...await buildInstallationHealthDiagnostics(),
244
+ ...await buildMemoryDiagnostics()
245
+ ];
246
+ }
247
+ function PropertyValue({
248
+ value
249
+ }) {
250
+ if (Array.isArray(value)) {
251
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
252
+ flexWrap: "wrap",
253
+ columnGap: 1,
254
+ flexShrink: 99,
255
+ children: value.map((item, i) => {
256
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
257
+ children: [
258
+ item,
259
+ i < value.length - 1 ? "," : ""
260
+ ]
261
+ }, i, true, undefined, this);
262
+ })
263
+ }, undefined, false, undefined, this);
264
+ }
265
+ if (typeof value === "string") {
266
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
267
+ children: value
268
+ }, undefined, false, undefined, this);
269
+ }
270
+ return value;
271
+ }
272
+ function Status({
273
+ context,
274
+ diagnosticsPromise
275
+ }) {
276
+ const mainLoopModel = useAppState((s) => s.mainLoopModel);
277
+ const mcp = useAppState((s) => s.mcp);
278
+ const [theme] = useTheme();
279
+ const sections = React.useMemo(() => [
280
+ buildPrimarySection(),
281
+ buildSecondarySection({ mainLoopModel, mcp, theme, context })
282
+ ], [mainLoopModel, mcp, theme, context]);
283
+ const grow = useIsInsideModal() ? 1 : undefined;
284
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
285
+ flexDirection: "column",
286
+ flexGrow: grow,
287
+ children: [
288
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
289
+ flexDirection: "column",
290
+ gap: 1,
291
+ flexGrow: grow,
292
+ children: [
293
+ sections.map((properties, i) => properties.length > 0 && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
294
+ flexDirection: "column",
295
+ children: properties.map(({ label, value }, j) => /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
296
+ flexDirection: "row",
297
+ gap: 1,
298
+ flexShrink: 0,
299
+ children: [
300
+ label !== undefined && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
301
+ bold: true,
302
+ children: [
303
+ label,
304
+ ":"
305
+ ]
306
+ }, undefined, true, undefined, this),
307
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(PropertyValue, {
308
+ value
309
+ }, undefined, false, undefined, this)
310
+ ]
311
+ }, j, true, undefined, this))
312
+ }, i, false, undefined, this)),
313
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(import_react.Suspense, {
314
+ fallback: null,
315
+ children: /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Diagnostics, {
316
+ promise: diagnosticsPromise
317
+ }, undefined, false, undefined, this)
318
+ }, undefined, false, undefined, this)
319
+ ]
320
+ }, undefined, true, undefined, this),
321
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
322
+ dimColor: true,
323
+ children: /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ConfigurableShortcutHint, {
324
+ action: "confirm:no",
325
+ context: "Settings",
326
+ fallback: "Esc",
327
+ description: "cancel"
328
+ }, undefined, false, undefined, this)
329
+ }, undefined, false, undefined, this)
330
+ ]
331
+ }, undefined, true, undefined, this);
332
+ }
333
+ function Diagnostics({
334
+ promise
335
+ }) {
336
+ const diagnostics = import_react.use(promise);
337
+ if (diagnostics.length === 0)
338
+ return null;
339
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
340
+ flexDirection: "column",
341
+ paddingBottom: 1,
342
+ children: [
343
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
344
+ bold: true,
345
+ children: "System Diagnostics"
346
+ }, undefined, false, undefined, this),
347
+ diagnostics.map((diagnostic, i) => /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
348
+ flexDirection: "row",
349
+ gap: 1,
350
+ paddingX: 1,
351
+ children: [
352
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
353
+ color: "error",
354
+ children: figures_default.warning
355
+ }, undefined, false, undefined, this),
356
+ typeof diagnostic === "string" ? /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
357
+ wrap: "wrap",
358
+ children: diagnostic
359
+ }, undefined, false, undefined, this) : diagnostic
360
+ ]
361
+ }, i, true, undefined, this))
362
+ ]
363
+ }, undefined, true, undefined, this);
364
+ }
365
+ var React, import_react, jsx_dev_runtime;
366
+ var init_Status = __esm(() => {
367
+ init_figures();
368
+ init_state();
369
+ init_modalContext();
370
+ init_src();
371
+ init_AppState();
372
+ init_cwd();
373
+ init_sessionStorage();
374
+ init_status();
375
+ init_ConfigurableShortcutHint();
376
+ React = __toESM(require_react(), 1);
377
+ import_react = __toESM(require_react(), 1);
378
+ jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
379
+ });
380
+
381
+ // src/components/ChannelDowngradeDialog.tsx
382
+ function ChannelDowngradeDialog({
383
+ currentVersion,
384
+ onChoice
385
+ }) {
386
+ function handleSelect(value) {
387
+ onChoice(value);
388
+ }
389
+ function handleCancel() {
390
+ onChoice("cancel");
391
+ }
392
+ return /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(Dialog, {
393
+ title: "Switch to Stable Channel",
394
+ onCancel: handleCancel,
395
+ color: "permission",
396
+ hideBorder: true,
397
+ hideInputGuide: true,
398
+ children: [
399
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedText, {
400
+ children: [
401
+ "The stable channel may have an older version than what you're currently running (",
402
+ currentVersion,
403
+ ")."
404
+ ]
405
+ }, undefined, true, undefined, this),
406
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedText, {
407
+ dimColor: true,
408
+ children: "How would you like to handle this?"
409
+ }, undefined, false, undefined, this),
410
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(Select, {
411
+ options: [
412
+ {
413
+ label: "Allow possible downgrade to stable version",
414
+ value: "downgrade"
415
+ },
416
+ {
417
+ label: `Stay on current version (${currentVersion}) until stable catches up`,
418
+ value: "stay"
419
+ }
420
+ ],
421
+ onChange: handleSelect
422
+ }, undefined, false, undefined, this)
423
+ ]
424
+ }, undefined, true, undefined, this);
425
+ }
426
+ var jsx_dev_runtime2;
427
+ var init_ChannelDowngradeDialog = __esm(() => {
428
+ init_src();
429
+ init_CustomSelect();
430
+ init_src();
431
+ jsx_dev_runtime2 = __toESM(require_jsx_dev_runtime(), 1);
432
+ });
433
+
434
+ // src/components/OutputStylePicker.tsx
435
+ function mapConfigsToOptions(styles) {
436
+ return Object.entries(styles).map(([style, config]) => ({
437
+ label: config?.name ?? DEFAULT_OUTPUT_STYLE_LABEL,
438
+ value: style,
439
+ description: config?.description ?? DEFAULT_OUTPUT_STYLE_DESCRIPTION
440
+ }));
441
+ }
442
+ function OutputStylePicker({
443
+ initialStyle,
444
+ onComplete,
445
+ onCancel,
446
+ isStandaloneCommand
447
+ }) {
448
+ const [styleOptions, setStyleOptions] = import_react2.useState([]);
449
+ const [isLoading, setIsLoading] = import_react2.useState(true);
450
+ import_react2.useEffect(() => {
451
+ getAllOutputStyles(getCwd()).then((allStyles) => {
452
+ const options = mapConfigsToOptions(allStyles);
453
+ setStyleOptions(options);
454
+ setIsLoading(false);
455
+ }).catch(() => {
456
+ const builtInOptions = mapConfigsToOptions(OUTPUT_STYLE_CONFIG);
457
+ setStyleOptions(builtInOptions);
458
+ setIsLoading(false);
459
+ });
460
+ }, []);
461
+ const handleStyleSelect = import_react2.useCallback((style) => {
462
+ const outputStyle = style;
463
+ onComplete(outputStyle);
464
+ }, [onComplete]);
465
+ return /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(Dialog, {
466
+ title: "Preferred output style",
467
+ onCancel,
468
+ hideInputGuide: !isStandaloneCommand,
469
+ hideBorder: !isStandaloneCommand,
470
+ children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
471
+ flexDirection: "column",
472
+ gap: 1,
473
+ children: [
474
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
475
+ marginTop: 1,
476
+ children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
477
+ dimColor: true,
478
+ children: "This changes how Claude Code communicates with you"
479
+ }, undefined, false, undefined, this)
480
+ }, undefined, false, undefined, this),
481
+ isLoading ? /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
482
+ dimColor: true,
483
+ children: "Loading output styles\u2026"
484
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(Select, {
485
+ options: styleOptions,
486
+ onChange: handleStyleSelect,
487
+ visibleOptionCount: 10,
488
+ defaultValue: initialStyle
489
+ }, undefined, false, undefined, this)
490
+ ]
491
+ }, undefined, true, undefined, this)
492
+ }, undefined, false, undefined, this);
493
+ }
494
+ var import_react2, jsx_dev_runtime3, DEFAULT_OUTPUT_STYLE_LABEL = "Default", DEFAULT_OUTPUT_STYLE_DESCRIPTION = "Claude completes coding tasks efficiently and provides concise responses";
495
+ var init_OutputStylePicker = __esm(() => {
496
+ init_outputStyles();
497
+ init_src();
498
+ init_cwd();
499
+ init_select();
500
+ import_react2 = __toESM(require_react(), 1);
501
+ jsx_dev_runtime3 = __toESM(require_jsx_dev_runtime(), 1);
502
+ });
503
+
504
+ // src/components/LanguagePicker.tsx
505
+ function LanguagePicker({
506
+ initialLanguage,
507
+ onComplete,
508
+ onCancel
509
+ }) {
510
+ const [language, setLanguage] = import_react3.useState(initialLanguage);
511
+ const [cursorOffset, setCursorOffset] = import_react3.useState((initialLanguage ?? "").length);
512
+ useKeybinding("confirm:no", onCancel, { context: "Settings" });
513
+ function handleSubmit() {
514
+ const trimmed = language?.trim();
515
+ onComplete(trimmed || undefined);
516
+ }
517
+ return /* @__PURE__ */ jsx_dev_runtime4.jsxDEV(ThemedBox_default, {
518
+ flexDirection: "column",
519
+ gap: 1,
520
+ children: [
521
+ /* @__PURE__ */ jsx_dev_runtime4.jsxDEV(ThemedText, {
522
+ children: "Enter your preferred response and voice language:"
523
+ }, undefined, false, undefined, this),
524
+ /* @__PURE__ */ jsx_dev_runtime4.jsxDEV(ThemedBox_default, {
525
+ flexDirection: "row",
526
+ gap: 1,
527
+ children: [
528
+ /* @__PURE__ */ jsx_dev_runtime4.jsxDEV(ThemedText, {
529
+ children: figures_default.pointer
530
+ }, undefined, false, undefined, this),
531
+ /* @__PURE__ */ jsx_dev_runtime4.jsxDEV(TextInput, {
532
+ value: language ?? "",
533
+ onChange: setLanguage,
534
+ onSubmit: handleSubmit,
535
+ focus: true,
536
+ showCursor: true,
537
+ placeholder: `e.g., Japanese, \u65E5\u672C\u8A9E, Espa\xF1ol${figures_default.ellipsis}`,
538
+ columns: 60,
539
+ cursorOffset,
540
+ onChangeCursorOffset: setCursorOffset
541
+ }, undefined, false, undefined, this)
542
+ ]
543
+ }, undefined, true, undefined, this),
544
+ /* @__PURE__ */ jsx_dev_runtime4.jsxDEV(ThemedText, {
545
+ dimColor: true,
546
+ children: "Leave empty for default (English)"
547
+ }, undefined, false, undefined, this)
548
+ ]
549
+ }, undefined, true, undefined, this);
550
+ }
551
+ var import_react3, jsx_dev_runtime4;
552
+ var init_LanguagePicker = __esm(() => {
553
+ init_figures();
554
+ init_src();
555
+ init_useKeybinding();
556
+ init_TextInput();
557
+ import_react3 = __toESM(require_react(), 1);
558
+ jsx_dev_runtime4 = __toESM(require_jsx_dev_runtime(), 1);
559
+ });
560
+
561
+ // src/components/Settings/Config.tsx
562
+ function Config({
563
+ onClose,
564
+ context,
565
+ setTabsHidden,
566
+ onIsSearchModeChange,
567
+ contentHeight
568
+ }) {
569
+ const { headerFocused, focusHeader } = useTabHeaderFocus();
570
+ const insideModal = useIsInsideModal();
571
+ const [, setTheme] = useTheme();
572
+ const themeSetting = useThemeSetting();
573
+ const [globalConfig, setGlobalConfig] = import_react4.useState(getGlobalConfig());
574
+ const initialConfig = React3.useRef(getGlobalConfig());
575
+ const [settingsData, setSettingsData] = import_react4.useState(getInitialSettings());
576
+ const initialSettingsData = React3.useRef(getInitialSettings());
577
+ const [currentOutputStyle, setCurrentOutputStyle] = import_react4.useState(settingsData?.outputStyle || DEFAULT_OUTPUT_STYLE_NAME);
578
+ const initialOutputStyle = React3.useRef(currentOutputStyle);
579
+ const [currentLanguage, setCurrentLanguage] = import_react4.useState(settingsData?.language);
580
+ const initialLanguage = React3.useRef(currentLanguage);
581
+ const [selectedIndex, setSelectedIndex] = import_react4.useState(0);
582
+ const [scrollOffset, setScrollOffset] = import_react4.useState(0);
583
+ const [isSearchMode, setIsSearchMode] = import_react4.useState(true);
584
+ const isTerminalFocused = useTerminalFocus();
585
+ const { rows } = useTerminalSize();
586
+ const paneCap = contentHeight ?? Math.min(Math.floor(rows * 0.8), 30);
587
+ const maxVisible = Math.max(5, paneCap - 10);
588
+ const mainLoopModel = useAppState((s) => s.mainLoopModel);
589
+ const verbose = useAppState((s) => s.verbose);
590
+ const thinkingEnabled = useAppState((s) => s.thinkingEnabled);
591
+ const isFastMode = useAppState((s) => isFastModeEnabled() ? s.fastMode : false);
592
+ const promptSuggestionEnabled = useAppState((s) => s.promptSuggestionEnabled);
593
+ const showAutoInDefaultModePicker = false;
594
+ const showDefaultViewPicker = (init_BriefTool(), __toCommonJS(exports_BriefTool)).isBriefEntitled();
595
+ const setAppState = useSetAppState();
596
+ const [changes, setChanges] = import_react4.useState({});
597
+ const initialThinkingEnabled = React3.useRef(thinkingEnabled);
598
+ const [initialLocalSettings] = import_react4.useState(() => getSettingsForSource("localSettings"));
599
+ const [initialUserSettings] = import_react4.useState(() => getSettingsForSource("userSettings"));
600
+ const initialThemeSetting = React3.useRef(themeSetting);
601
+ const store = useAppStateStore();
602
+ const [initialAppState] = import_react4.useState(() => {
603
+ const s = store.getState();
604
+ return {
605
+ mainLoopModel: s.mainLoopModel,
606
+ mainLoopModelForSession: s.mainLoopModelForSession,
607
+ verbose: s.verbose,
608
+ thinkingEnabled: s.thinkingEnabled,
609
+ fastMode: s.fastMode,
610
+ promptSuggestionEnabled: s.promptSuggestionEnabled,
611
+ isBriefOnly: s.isBriefOnly,
612
+ replBridgeEnabled: s.replBridgeEnabled,
613
+ replBridgeOutboundOnly: s.replBridgeOutboundOnly,
614
+ settings: s.settings
615
+ };
616
+ });
617
+ const [initialUserMsgOptIn] = import_react4.useState(() => getUserMsgOptIn());
618
+ const isDirty = React3.useRef(false);
619
+ const [showThinkingWarning, setShowThinkingWarning] = import_react4.useState(false);
620
+ const [showSubmenu, setShowSubmenu] = import_react4.useState(null);
621
+ const {
622
+ query: searchQuery,
623
+ setQuery: setSearchQuery,
624
+ cursorOffset: searchCursorOffset
625
+ } = useSearchInput({
626
+ isActive: isSearchMode && showSubmenu === null && !headerFocused,
627
+ onExit: () => setIsSearchMode(false),
628
+ onExitUp: focusHeader,
629
+ passthroughCtrlKeys: ["c", "d"]
630
+ });
631
+ const ownsEsc = isSearchMode && !headerFocused;
632
+ React3.useEffect(() => {
633
+ onIsSearchModeChange?.(ownsEsc);
634
+ }, [ownsEsc, onIsSearchModeChange]);
635
+ const isConnectedToIde = hasAccessToIDEExtensionDiffFeature(context.options.mcpClients);
636
+ const isFileCheckpointingAvailable = !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING);
637
+ const memoryFiles = React3.use(getMemoryFiles(true));
638
+ const shouldShowExternalIncludesToggle = hasExternalClaudeMdIncludes(memoryFiles);
639
+ const autoUpdaterDisabledReason = getAutoUpdaterDisabledReason();
640
+ function onChangeMainModelConfig(value) {
641
+ const previousModel = mainLoopModel;
642
+ logEvent("tengu_config_model_changed", {
643
+ from_model: previousModel,
644
+ to_model: value
645
+ });
646
+ setAppState((prev) => ({
647
+ ...prev,
648
+ mainLoopModel: value,
649
+ mainLoopModelForSession: null
650
+ }));
651
+ setChanges((prev) => {
652
+ const valStr = modelDisplayString(value) + (isBilledAsExtraUsage(value, false, isOpus1mMergeEnabled()) ? " \xB7 Billed as extra usage" : "");
653
+ if ("model" in prev) {
654
+ const { model, ...rest } = prev;
655
+ return { ...rest, model: valStr };
656
+ }
657
+ return { ...prev, model: valStr };
658
+ });
659
+ }
660
+ function onChangeVerbose(value) {
661
+ saveGlobalConfig((current) => ({ ...current, verbose: value }));
662
+ setGlobalConfig({ ...getGlobalConfig(), verbose: value });
663
+ setAppState((prev) => ({
664
+ ...prev,
665
+ verbose: value
666
+ }));
667
+ setChanges((prev) => {
668
+ if ("verbose" in prev) {
669
+ const { verbose: verbose2, ...rest } = prev;
670
+ return rest;
671
+ }
672
+ return { ...prev, verbose: value };
673
+ });
674
+ }
675
+ const settingsItems = [
676
+ {
677
+ id: "autoCompactEnabled",
678
+ label: "Auto-compact",
679
+ value: globalConfig.autoCompactEnabled,
680
+ type: "boolean",
681
+ onChange(autoCompactEnabled) {
682
+ saveGlobalConfig((current) => ({ ...current, autoCompactEnabled }));
683
+ setGlobalConfig({ ...getGlobalConfig(), autoCompactEnabled });
684
+ logEvent("tengu_auto_compact_setting_changed", {
685
+ enabled: autoCompactEnabled
686
+ });
687
+ }
688
+ },
689
+ {
690
+ id: "spinnerTipsEnabled",
691
+ label: "Show tips",
692
+ value: settingsData?.spinnerTipsEnabled ?? true,
693
+ type: "boolean",
694
+ onChange(spinnerTipsEnabled) {
695
+ updateSettingsForSource("localSettings", {
696
+ spinnerTipsEnabled
697
+ });
698
+ setSettingsData((prev) => ({
699
+ ...prev,
700
+ spinnerTipsEnabled
701
+ }));
702
+ logEvent("tengu_tips_setting_changed", {
703
+ enabled: spinnerTipsEnabled
704
+ });
705
+ }
706
+ },
707
+ {
708
+ id: "prefersReducedMotion",
709
+ label: "Reduce motion",
710
+ value: settingsData?.prefersReducedMotion ?? false,
711
+ type: "boolean",
712
+ onChange(prefersReducedMotion) {
713
+ updateSettingsForSource("localSettings", {
714
+ prefersReducedMotion
715
+ });
716
+ setSettingsData((prev) => ({
717
+ ...prev,
718
+ prefersReducedMotion
719
+ }));
720
+ setAppState((prev) => ({
721
+ ...prev,
722
+ settings: { ...prev.settings, prefersReducedMotion }
723
+ }));
724
+ logEvent("tengu_reduce_motion_setting_changed", {
725
+ enabled: prefersReducedMotion
726
+ });
727
+ }
728
+ },
729
+ {
730
+ id: "thinkingEnabled",
731
+ label: "Thinking mode",
732
+ value: thinkingEnabled ?? true,
733
+ type: "boolean",
734
+ onChange(enabled) {
735
+ setAppState((prev) => ({ ...prev, thinkingEnabled: enabled }));
736
+ updateSettingsForSource("userSettings", {
737
+ alwaysThinkingEnabled: enabled ? undefined : false
738
+ });
739
+ logEvent("tengu_thinking_toggled", { enabled });
740
+ }
741
+ },
742
+ ...isFastModeEnabled() && isFastModeAvailable() ? [
743
+ {
744
+ id: "fastMode",
745
+ label: `Fast mode (${FAST_MODE_MODEL_DISPLAY} only)`,
746
+ value: !!isFastMode,
747
+ type: "boolean",
748
+ onChange(enabled) {
749
+ clearFastModeCooldown();
750
+ updateSettingsForSource("userSettings", {
751
+ fastMode: enabled ? true : undefined
752
+ });
753
+ if (enabled) {
754
+ setAppState((prev) => ({
755
+ ...prev,
756
+ mainLoopModel: getFastModeModel(),
757
+ mainLoopModelForSession: null,
758
+ fastMode: true
759
+ }));
760
+ setChanges((prev) => ({
761
+ ...prev,
762
+ model: getFastModeModel(),
763
+ "Fast mode": "ON"
764
+ }));
765
+ } else {
766
+ setAppState((prev) => ({
767
+ ...prev,
768
+ fastMode: false
769
+ }));
770
+ setChanges((prev) => ({ ...prev, "Fast mode": "OFF" }));
771
+ }
772
+ }
773
+ }
774
+ ] : [],
775
+ ...getFeatureValue_CACHED_MAY_BE_STALE("tengu_chomp_inflection", false) ? [
776
+ {
777
+ id: "promptSuggestionEnabled",
778
+ label: "Prompt suggestions",
779
+ value: promptSuggestionEnabled,
780
+ type: "boolean",
781
+ onChange(enabled) {
782
+ setAppState((prev) => ({
783
+ ...prev,
784
+ promptSuggestionEnabled: enabled
785
+ }));
786
+ updateSettingsForSource("userSettings", {
787
+ promptSuggestionEnabled: enabled ? undefined : false
788
+ });
789
+ }
790
+ }
791
+ ] : [],
792
+ ...process.env.USER_TYPE === "ant" ? [
793
+ {
794
+ id: "speculationEnabled",
795
+ label: "Speculative execution",
796
+ value: globalConfig.speculationEnabled ?? true,
797
+ type: "boolean",
798
+ onChange(enabled) {
799
+ saveGlobalConfig((current) => {
800
+ if (current.speculationEnabled === enabled)
801
+ return current;
802
+ return {
803
+ ...current,
804
+ speculationEnabled: enabled
805
+ };
806
+ });
807
+ setGlobalConfig({
808
+ ...getGlobalConfig(),
809
+ speculationEnabled: enabled
810
+ });
811
+ logEvent("tengu_speculation_setting_changed", {
812
+ enabled
813
+ });
814
+ }
815
+ }
816
+ ] : [],
817
+ ...isFileCheckpointingAvailable ? [
818
+ {
819
+ id: "fileCheckpointingEnabled",
820
+ label: "Rewind code (checkpoints)",
821
+ value: globalConfig.fileCheckpointingEnabled,
822
+ type: "boolean",
823
+ onChange(enabled) {
824
+ saveGlobalConfig((current) => ({
825
+ ...current,
826
+ fileCheckpointingEnabled: enabled
827
+ }));
828
+ setGlobalConfig({
829
+ ...getGlobalConfig(),
830
+ fileCheckpointingEnabled: enabled
831
+ });
832
+ logEvent("tengu_file_history_snapshots_setting_changed", {
833
+ enabled
834
+ });
835
+ }
836
+ }
837
+ ] : [],
838
+ {
839
+ id: "verbose",
840
+ label: "Verbose output",
841
+ value: verbose,
842
+ type: "boolean",
843
+ onChange: onChangeVerbose
844
+ },
845
+ {
846
+ id: "terminalProgressBarEnabled",
847
+ label: "Terminal progress bar",
848
+ value: globalConfig.terminalProgressBarEnabled,
849
+ type: "boolean",
850
+ onChange(terminalProgressBarEnabled) {
851
+ saveGlobalConfig((current) => ({
852
+ ...current,
853
+ terminalProgressBarEnabled
854
+ }));
855
+ setGlobalConfig({ ...getGlobalConfig(), terminalProgressBarEnabled });
856
+ logEvent("tengu_terminal_progress_bar_setting_changed", {
857
+ enabled: terminalProgressBarEnabled
858
+ });
859
+ }
860
+ },
861
+ ...getFeatureValue_CACHED_MAY_BE_STALE("tengu_terminal_sidebar", false) ? [
862
+ {
863
+ id: "showStatusInTerminalTab",
864
+ label: "Show status in terminal tab",
865
+ value: globalConfig.showStatusInTerminalTab ?? false,
866
+ type: "boolean",
867
+ onChange(showStatusInTerminalTab) {
868
+ saveGlobalConfig((current) => ({
869
+ ...current,
870
+ showStatusInTerminalTab
871
+ }));
872
+ setGlobalConfig({
873
+ ...getGlobalConfig(),
874
+ showStatusInTerminalTab
875
+ });
876
+ logEvent("tengu_terminal_tab_status_setting_changed", {
877
+ enabled: showStatusInTerminalTab
878
+ });
879
+ }
880
+ }
881
+ ] : [],
882
+ {
883
+ id: "showTurnDuration",
884
+ label: "Show turn duration",
885
+ value: globalConfig.showTurnDuration,
886
+ type: "boolean",
887
+ onChange(showTurnDuration) {
888
+ saveGlobalConfig((current) => ({ ...current, showTurnDuration }));
889
+ setGlobalConfig({ ...getGlobalConfig(), showTurnDuration });
890
+ logEvent("tengu_show_turn_duration_setting_changed", {
891
+ enabled: showTurnDuration
892
+ });
893
+ }
894
+ },
895
+ {
896
+ id: "defaultPermissionMode",
897
+ label: "Default permission mode",
898
+ value: settingsData?.permissions?.defaultMode || "default",
899
+ options: (() => {
900
+ const priorityOrder = ["default", "plan"];
901
+ const allModes = EXTERNAL_PERMISSION_MODES;
902
+ const excluded = ["bypassPermissions"];
903
+ if (false) {}
904
+ return [
905
+ ...priorityOrder,
906
+ ...allModes.filter((m) => !priorityOrder.includes(m) && !excluded.includes(m))
907
+ ];
908
+ })(),
909
+ type: "enum",
910
+ onChange(mode) {
911
+ const parsedMode = permissionModeFromString(mode);
912
+ const validatedMode = isExternalPermissionMode(parsedMode) ? toExternalPermissionMode(parsedMode) : parsedMode;
913
+ const result = updateSettingsForSource("userSettings", {
914
+ permissions: {
915
+ ...settingsData?.permissions,
916
+ defaultMode: validatedMode
917
+ }
918
+ });
919
+ if (result.error) {
920
+ logError(result.error);
921
+ return;
922
+ }
923
+ setSettingsData((prev) => ({
924
+ ...prev,
925
+ permissions: {
926
+ ...prev?.permissions,
927
+ defaultMode: validatedMode
928
+ }
929
+ }));
930
+ setChanges((prev) => ({ ...prev, defaultPermissionMode: mode }));
931
+ logEvent("tengu_config_changed", {
932
+ setting: "defaultPermissionMode",
933
+ value: mode
934
+ });
935
+ }
936
+ },
937
+ ...[],
938
+ {
939
+ id: "respectGitignore",
940
+ label: "Respect .gitignore in file picker",
941
+ value: globalConfig.respectGitignore,
942
+ type: "boolean",
943
+ onChange(respectGitignore) {
944
+ saveGlobalConfig((current) => ({ ...current, respectGitignore }));
945
+ setGlobalConfig({ ...getGlobalConfig(), respectGitignore });
946
+ logEvent("tengu_respect_gitignore_setting_changed", {
947
+ enabled: respectGitignore
948
+ });
949
+ }
950
+ },
951
+ {
952
+ id: "copyFullResponse",
953
+ label: "Always copy full response (skip /copy picker)",
954
+ value: globalConfig.copyFullResponse,
955
+ type: "boolean",
956
+ onChange(copyFullResponse) {
957
+ saveGlobalConfig((current) => ({ ...current, copyFullResponse }));
958
+ setGlobalConfig({ ...getGlobalConfig(), copyFullResponse });
959
+ logEvent("tengu_config_changed", {
960
+ setting: "copyFullResponse",
961
+ value: String(copyFullResponse)
962
+ });
963
+ }
964
+ },
965
+ ...isFullscreenEnvEnabled() ? [
966
+ {
967
+ id: "copyOnSelect",
968
+ label: "Copy on select",
969
+ value: globalConfig.copyOnSelect ?? true,
970
+ type: "boolean",
971
+ onChange(copyOnSelect) {
972
+ saveGlobalConfig((current) => ({ ...current, copyOnSelect }));
973
+ setGlobalConfig({ ...getGlobalConfig(), copyOnSelect });
974
+ logEvent("tengu_config_changed", {
975
+ setting: "copyOnSelect",
976
+ value: String(copyOnSelect)
977
+ });
978
+ }
979
+ }
980
+ ] : [],
981
+ autoUpdaterDisabledReason ? {
982
+ id: "autoUpdatesChannel",
983
+ label: "Auto-update channel",
984
+ value: "disabled",
985
+ type: "managedEnum",
986
+ onChange() {}
987
+ } : {
988
+ id: "autoUpdatesChannel",
989
+ label: "Auto-update channel",
990
+ value: settingsData?.autoUpdatesChannel ?? "latest",
991
+ type: "managedEnum",
992
+ onChange() {}
993
+ },
994
+ {
995
+ id: "theme",
996
+ label: "Theme",
997
+ value: themeSetting,
998
+ type: "managedEnum",
999
+ onChange: setTheme
1000
+ },
1001
+ {
1002
+ id: "notifChannel",
1003
+ label: "Notifications",
1004
+ value: globalConfig.preferredNotifChannel,
1005
+ options: [
1006
+ "auto",
1007
+ "iterm2",
1008
+ "terminal_bell",
1009
+ "iterm2_with_bell",
1010
+ "kitty",
1011
+ "ghostty",
1012
+ "notifications_disabled"
1013
+ ],
1014
+ type: "enum",
1015
+ onChange(notifChannel) {
1016
+ saveGlobalConfig((current) => ({
1017
+ ...current,
1018
+ preferredNotifChannel: notifChannel
1019
+ }));
1020
+ setGlobalConfig({
1021
+ ...getGlobalConfig(),
1022
+ preferredNotifChannel: notifChannel
1023
+ });
1024
+ }
1025
+ },
1026
+ ...[],
1027
+ {
1028
+ id: "outputStyle",
1029
+ label: "Output style",
1030
+ value: currentOutputStyle,
1031
+ type: "managedEnum",
1032
+ onChange: () => {}
1033
+ },
1034
+ ...showDefaultViewPicker ? [
1035
+ {
1036
+ id: "defaultView",
1037
+ label: "What you see by default",
1038
+ value: settingsData?.defaultView === undefined ? "default" : String(settingsData.defaultView),
1039
+ options: ["transcript", "chat", "default"],
1040
+ type: "enum",
1041
+ onChange(selected) {
1042
+ const defaultView = selected === "default" ? undefined : selected;
1043
+ updateSettingsForSource("localSettings", { defaultView });
1044
+ setSettingsData((prev) => ({ ...prev, defaultView }));
1045
+ const nextBrief = defaultView === "chat";
1046
+ setAppState((prev) => {
1047
+ if (prev.isBriefOnly === nextBrief)
1048
+ return prev;
1049
+ return { ...prev, isBriefOnly: nextBrief };
1050
+ });
1051
+ setUserMsgOptIn(nextBrief);
1052
+ setChanges((prev) => ({ ...prev, "Default view": selected }));
1053
+ logEvent("tengu_default_view_setting_changed", {
1054
+ value: defaultView ?? "unset"
1055
+ });
1056
+ }
1057
+ }
1058
+ ] : [],
1059
+ {
1060
+ id: "language",
1061
+ label: "Language",
1062
+ value: currentLanguage ?? "Default (English)",
1063
+ type: "managedEnum",
1064
+ onChange: () => {}
1065
+ },
1066
+ {
1067
+ id: "editorMode",
1068
+ label: "Editor mode",
1069
+ value: globalConfig.editorMode === "emacs" ? "normal" : globalConfig.editorMode || "normal",
1070
+ options: ["normal", "vim"],
1071
+ type: "enum",
1072
+ onChange(value) {
1073
+ saveGlobalConfig((current) => ({
1074
+ ...current,
1075
+ editorMode: value
1076
+ }));
1077
+ setGlobalConfig({
1078
+ ...getGlobalConfig(),
1079
+ editorMode: value
1080
+ });
1081
+ logEvent("tengu_editor_mode_changed", {
1082
+ mode: value,
1083
+ source: "config_panel"
1084
+ });
1085
+ }
1086
+ },
1087
+ {
1088
+ id: "prStatusFooterEnabled",
1089
+ label: "Show PR status footer",
1090
+ value: globalConfig.prStatusFooterEnabled ?? true,
1091
+ type: "boolean",
1092
+ onChange(enabled) {
1093
+ saveGlobalConfig((current) => {
1094
+ if (current.prStatusFooterEnabled === enabled)
1095
+ return current;
1096
+ return {
1097
+ ...current,
1098
+ prStatusFooterEnabled: enabled
1099
+ };
1100
+ });
1101
+ setGlobalConfig({
1102
+ ...getGlobalConfig(),
1103
+ prStatusFooterEnabled: enabled
1104
+ });
1105
+ logEvent("tengu_pr_status_footer_setting_changed", {
1106
+ enabled
1107
+ });
1108
+ }
1109
+ },
1110
+ {
1111
+ id: "model",
1112
+ label: "Model",
1113
+ value: mainLoopModel === null ? "Default (recommended)" : mainLoopModel,
1114
+ type: "managedEnum",
1115
+ onChange: onChangeMainModelConfig
1116
+ },
1117
+ ...isConnectedToIde ? [
1118
+ {
1119
+ id: "diffTool",
1120
+ label: "Diff tool",
1121
+ value: globalConfig.diffTool ?? "auto",
1122
+ options: ["terminal", "auto"],
1123
+ type: "enum",
1124
+ onChange(diffTool) {
1125
+ saveGlobalConfig((current) => ({
1126
+ ...current,
1127
+ diffTool
1128
+ }));
1129
+ setGlobalConfig({
1130
+ ...getGlobalConfig(),
1131
+ diffTool
1132
+ });
1133
+ logEvent("tengu_diff_tool_changed", {
1134
+ tool: diffTool,
1135
+ source: "config_panel"
1136
+ });
1137
+ }
1138
+ }
1139
+ ] : [],
1140
+ ...!isSupportedTerminal() ? [
1141
+ {
1142
+ id: "autoConnectIde",
1143
+ label: "Auto-connect to IDE (external terminal)",
1144
+ value: globalConfig.autoConnectIde ?? false,
1145
+ type: "boolean",
1146
+ onChange(autoConnectIde) {
1147
+ saveGlobalConfig((current) => ({ ...current, autoConnectIde }));
1148
+ setGlobalConfig({ ...getGlobalConfig(), autoConnectIde });
1149
+ logEvent("tengu_auto_connect_ide_changed", {
1150
+ enabled: autoConnectIde,
1151
+ source: "config_panel"
1152
+ });
1153
+ }
1154
+ }
1155
+ ] : [],
1156
+ ...isSupportedTerminal() ? [
1157
+ {
1158
+ id: "autoInstallIdeExtension",
1159
+ label: "Auto-install IDE extension",
1160
+ value: globalConfig.autoInstallIdeExtension ?? true,
1161
+ type: "boolean",
1162
+ onChange(autoInstallIdeExtension) {
1163
+ saveGlobalConfig((current) => ({
1164
+ ...current,
1165
+ autoInstallIdeExtension
1166
+ }));
1167
+ setGlobalConfig({ ...getGlobalConfig(), autoInstallIdeExtension });
1168
+ logEvent("tengu_auto_install_ide_extension_changed", {
1169
+ enabled: autoInstallIdeExtension,
1170
+ source: "config_panel"
1171
+ });
1172
+ }
1173
+ }
1174
+ ] : [],
1175
+ {
1176
+ id: "claudeInChromeDefaultEnabled",
1177
+ label: "Claude in Chrome enabled by default",
1178
+ value: globalConfig.claudeInChromeDefaultEnabled ?? true,
1179
+ type: "boolean",
1180
+ onChange(enabled) {
1181
+ saveGlobalConfig((current) => ({
1182
+ ...current,
1183
+ claudeInChromeDefaultEnabled: enabled
1184
+ }));
1185
+ setGlobalConfig({
1186
+ ...getGlobalConfig(),
1187
+ claudeInChromeDefaultEnabled: enabled
1188
+ });
1189
+ logEvent("tengu_claude_in_chrome_setting_changed", {
1190
+ enabled
1191
+ });
1192
+ }
1193
+ },
1194
+ ...isAgentSwarmsEnabled() ? (() => {
1195
+ const cliOverride = getCliTeammateModeOverride();
1196
+ const label = cliOverride ? `Teammate mode [overridden: ${cliOverride}]` : "Teammate mode";
1197
+ return [
1198
+ {
1199
+ id: "teammateMode",
1200
+ label,
1201
+ value: globalConfig.teammateMode ?? "auto",
1202
+ options: ["auto", "tmux", "in-process"],
1203
+ type: "enum",
1204
+ onChange(mode) {
1205
+ if (mode !== "auto" && mode !== "tmux" && mode !== "in-process") {
1206
+ return;
1207
+ }
1208
+ clearCliTeammateModeOverride(mode);
1209
+ saveGlobalConfig((current) => ({
1210
+ ...current,
1211
+ teammateMode: mode
1212
+ }));
1213
+ setGlobalConfig({
1214
+ ...getGlobalConfig(),
1215
+ teammateMode: mode
1216
+ });
1217
+ logEvent("tengu_teammate_mode_changed", {
1218
+ mode
1219
+ });
1220
+ }
1221
+ },
1222
+ {
1223
+ id: "teammateDefaultModel",
1224
+ label: "Default teammate model",
1225
+ value: teammateModelDisplayString(globalConfig.teammateDefaultModel),
1226
+ type: "managedEnum",
1227
+ onChange() {}
1228
+ }
1229
+ ];
1230
+ })() : [],
1231
+ ...[],
1232
+ ...shouldShowExternalIncludesToggle ? [
1233
+ {
1234
+ id: "showExternalIncludesDialog",
1235
+ label: "External CLAUDE.md includes",
1236
+ value: (() => {
1237
+ const projectConfig = getCurrentProjectConfig();
1238
+ if (projectConfig.hasClaudeMdExternalIncludesApproved) {
1239
+ return "true";
1240
+ } else {
1241
+ return "false";
1242
+ }
1243
+ })(),
1244
+ type: "managedEnum",
1245
+ onChange() {}
1246
+ }
1247
+ ] : [],
1248
+ ...process.env.ANTHROPIC_API_KEY && !isRunningOnHomespace() ? [
1249
+ {
1250
+ id: "apiKey",
1251
+ label: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1252
+ children: [
1253
+ "Use custom API key:",
1254
+ " ",
1255
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1256
+ bold: true,
1257
+ children: normalizeApiKeyForConfig(process.env.ANTHROPIC_API_KEY)
1258
+ }, undefined, false, undefined, this)
1259
+ ]
1260
+ }, undefined, true, undefined, this),
1261
+ searchText: "Use custom API key",
1262
+ value: Boolean(process.env.ANTHROPIC_API_KEY && globalConfig.customApiKeyResponses?.approved?.includes(normalizeApiKeyForConfig(process.env.ANTHROPIC_API_KEY))),
1263
+ type: "boolean",
1264
+ onChange(useCustomKey) {
1265
+ saveGlobalConfig((current) => {
1266
+ const updated = { ...current };
1267
+ if (!updated.customApiKeyResponses) {
1268
+ updated.customApiKeyResponses = {
1269
+ approved: [],
1270
+ rejected: []
1271
+ };
1272
+ }
1273
+ if (!updated.customApiKeyResponses.approved) {
1274
+ updated.customApiKeyResponses = {
1275
+ ...updated.customApiKeyResponses,
1276
+ approved: []
1277
+ };
1278
+ }
1279
+ if (!updated.customApiKeyResponses.rejected) {
1280
+ updated.customApiKeyResponses = {
1281
+ ...updated.customApiKeyResponses,
1282
+ rejected: []
1283
+ };
1284
+ }
1285
+ if (process.env.ANTHROPIC_API_KEY) {
1286
+ const truncatedKey = normalizeApiKeyForConfig(process.env.ANTHROPIC_API_KEY);
1287
+ if (useCustomKey) {
1288
+ updated.customApiKeyResponses = {
1289
+ ...updated.customApiKeyResponses,
1290
+ approved: [
1291
+ ...(updated.customApiKeyResponses.approved ?? []).filter((k) => k !== truncatedKey),
1292
+ truncatedKey
1293
+ ],
1294
+ rejected: (updated.customApiKeyResponses.rejected ?? []).filter((k) => k !== truncatedKey)
1295
+ };
1296
+ } else {
1297
+ updated.customApiKeyResponses = {
1298
+ ...updated.customApiKeyResponses,
1299
+ approved: (updated.customApiKeyResponses.approved ?? []).filter((k) => k !== truncatedKey),
1300
+ rejected: [
1301
+ ...(updated.customApiKeyResponses.rejected ?? []).filter((k) => k !== truncatedKey),
1302
+ truncatedKey
1303
+ ]
1304
+ };
1305
+ }
1306
+ }
1307
+ return updated;
1308
+ });
1309
+ setGlobalConfig(getGlobalConfig());
1310
+ }
1311
+ }
1312
+ ] : []
1313
+ ];
1314
+ const filteredSettingsItems = React3.useMemo(() => {
1315
+ if (!searchQuery)
1316
+ return settingsItems;
1317
+ const lowerQuery = searchQuery.toLowerCase();
1318
+ return settingsItems.filter((setting) => {
1319
+ if (setting.id.toLowerCase().includes(lowerQuery))
1320
+ return true;
1321
+ const searchableText = "searchText" in setting ? setting.searchText : setting.label;
1322
+ return searchableText.toLowerCase().includes(lowerQuery);
1323
+ });
1324
+ }, [settingsItems, searchQuery]);
1325
+ React3.useEffect(() => {
1326
+ if (selectedIndex >= filteredSettingsItems.length) {
1327
+ const newIndex = Math.max(0, filteredSettingsItems.length - 1);
1328
+ setSelectedIndex(newIndex);
1329
+ setScrollOffset(Math.max(0, newIndex - maxVisible + 1));
1330
+ return;
1331
+ }
1332
+ setScrollOffset((prev) => {
1333
+ if (selectedIndex < prev)
1334
+ return selectedIndex;
1335
+ if (selectedIndex >= prev + maxVisible)
1336
+ return selectedIndex - maxVisible + 1;
1337
+ return prev;
1338
+ });
1339
+ }, [filteredSettingsItems.length, selectedIndex, maxVisible]);
1340
+ const adjustScrollOffset = import_react4.useCallback((newIndex) => {
1341
+ setScrollOffset((prev) => {
1342
+ if (newIndex < prev)
1343
+ return newIndex;
1344
+ if (newIndex >= prev + maxVisible)
1345
+ return newIndex - maxVisible + 1;
1346
+ return prev;
1347
+ });
1348
+ }, [maxVisible]);
1349
+ const handleSaveAndClose = import_react4.useCallback(() => {
1350
+ if (showSubmenu !== null) {
1351
+ return;
1352
+ }
1353
+ const formattedChanges = Object.entries(changes).map(([key, value]) => {
1354
+ logEvent("tengu_config_changed", {
1355
+ key,
1356
+ value
1357
+ });
1358
+ return `Set ${key} to ${source_default.bold(value)}`;
1359
+ });
1360
+ const effectiveApiKey = isRunningOnHomespace() ? undefined : process.env.ANTHROPIC_API_KEY;
1361
+ const initialUsingCustomKey = Boolean(effectiveApiKey && initialConfig.current.customApiKeyResponses?.approved?.includes(normalizeApiKeyForConfig(effectiveApiKey)));
1362
+ const currentUsingCustomKey = Boolean(effectiveApiKey && globalConfig.customApiKeyResponses?.approved?.includes(normalizeApiKeyForConfig(effectiveApiKey)));
1363
+ if (initialUsingCustomKey !== currentUsingCustomKey) {
1364
+ formattedChanges.push(`${currentUsingCustomKey ? "Enabled" : "Disabled"} custom API key`);
1365
+ logEvent("tengu_config_changed", {
1366
+ key: "env.ANTHROPIC_API_KEY",
1367
+ value: currentUsingCustomKey
1368
+ });
1369
+ }
1370
+ if (globalConfig.theme !== initialConfig.current.theme) {
1371
+ formattedChanges.push(`Set theme to ${source_default.bold(globalConfig.theme)}`);
1372
+ }
1373
+ if (globalConfig.preferredNotifChannel !== initialConfig.current.preferredNotifChannel) {
1374
+ formattedChanges.push(`Set notifications to ${source_default.bold(globalConfig.preferredNotifChannel)}`);
1375
+ }
1376
+ if (currentOutputStyle !== initialOutputStyle.current) {
1377
+ formattedChanges.push(`Set output style to ${source_default.bold(currentOutputStyle)}`);
1378
+ }
1379
+ if (currentLanguage !== initialLanguage.current) {
1380
+ formattedChanges.push(`Set response language to ${source_default.bold(currentLanguage ?? "Default (English)")}`);
1381
+ }
1382
+ if (globalConfig.editorMode !== initialConfig.current.editorMode) {
1383
+ formattedChanges.push(`Set editor mode to ${source_default.bold(globalConfig.editorMode || "emacs")}`);
1384
+ }
1385
+ if (globalConfig.diffTool !== initialConfig.current.diffTool) {
1386
+ formattedChanges.push(`Set diff tool to ${source_default.bold(globalConfig.diffTool)}`);
1387
+ }
1388
+ if (globalConfig.autoConnectIde !== initialConfig.current.autoConnectIde) {
1389
+ formattedChanges.push(`${globalConfig.autoConnectIde ? "Enabled" : "Disabled"} auto-connect to IDE`);
1390
+ }
1391
+ if (globalConfig.autoInstallIdeExtension !== initialConfig.current.autoInstallIdeExtension) {
1392
+ formattedChanges.push(`${globalConfig.autoInstallIdeExtension ? "Enabled" : "Disabled"} auto-install IDE extension`);
1393
+ }
1394
+ if (globalConfig.autoCompactEnabled !== initialConfig.current.autoCompactEnabled) {
1395
+ formattedChanges.push(`${globalConfig.autoCompactEnabled ? "Enabled" : "Disabled"} auto-compact`);
1396
+ }
1397
+ if (globalConfig.respectGitignore !== initialConfig.current.respectGitignore) {
1398
+ formattedChanges.push(`${globalConfig.respectGitignore ? "Enabled" : "Disabled"} respect .gitignore in file picker`);
1399
+ }
1400
+ if (globalConfig.copyFullResponse !== initialConfig.current.copyFullResponse) {
1401
+ formattedChanges.push(`${globalConfig.copyFullResponse ? "Enabled" : "Disabled"} always copy full response`);
1402
+ }
1403
+ if (globalConfig.copyOnSelect !== initialConfig.current.copyOnSelect) {
1404
+ formattedChanges.push(`${globalConfig.copyOnSelect ? "Enabled" : "Disabled"} copy on select`);
1405
+ }
1406
+ if (globalConfig.terminalProgressBarEnabled !== initialConfig.current.terminalProgressBarEnabled) {
1407
+ formattedChanges.push(`${globalConfig.terminalProgressBarEnabled ? "Enabled" : "Disabled"} terminal progress bar`);
1408
+ }
1409
+ if (globalConfig.showStatusInTerminalTab !== initialConfig.current.showStatusInTerminalTab) {
1410
+ formattedChanges.push(`${globalConfig.showStatusInTerminalTab ? "Enabled" : "Disabled"} terminal tab status`);
1411
+ }
1412
+ if (globalConfig.showTurnDuration !== initialConfig.current.showTurnDuration) {
1413
+ formattedChanges.push(`${globalConfig.showTurnDuration ? "Enabled" : "Disabled"} turn duration`);
1414
+ }
1415
+ if (globalConfig.remoteControlAtStartup !== initialConfig.current.remoteControlAtStartup) {
1416
+ const remoteLabel = globalConfig.remoteControlAtStartup === undefined ? "Reset Remote Control to default" : `${globalConfig.remoteControlAtStartup ? "Enabled" : "Disabled"} Remote Control for all sessions`;
1417
+ formattedChanges.push(remoteLabel);
1418
+ }
1419
+ if (settingsData?.autoUpdatesChannel !== initialSettingsData.current?.autoUpdatesChannel) {
1420
+ formattedChanges.push(`Set auto-update channel to ${source_default.bold(settingsData?.autoUpdatesChannel ?? "latest")}`);
1421
+ }
1422
+ if (formattedChanges.length > 0) {
1423
+ onClose(formattedChanges.join(`
1424
+ `));
1425
+ } else {
1426
+ onClose("Config dialog dismissed", { display: "system" });
1427
+ }
1428
+ }, [
1429
+ showSubmenu,
1430
+ changes,
1431
+ globalConfig,
1432
+ mainLoopModel,
1433
+ currentOutputStyle,
1434
+ currentLanguage,
1435
+ settingsData?.autoUpdatesChannel,
1436
+ isFastModeEnabled() ? settingsData?.fastMode : undefined,
1437
+ onClose
1438
+ ]);
1439
+ const revertChanges = import_react4.useCallback(() => {
1440
+ if (themeSetting !== initialThemeSetting.current) {
1441
+ setTheme(initialThemeSetting.current);
1442
+ }
1443
+ saveGlobalConfig(() => initialConfig.current);
1444
+ const il = initialLocalSettings;
1445
+ updateSettingsForSource("localSettings", {
1446
+ spinnerTipsEnabled: il?.spinnerTipsEnabled,
1447
+ prefersReducedMotion: il?.prefersReducedMotion,
1448
+ defaultView: il?.defaultView,
1449
+ outputStyle: il?.outputStyle
1450
+ });
1451
+ const iu = initialUserSettings;
1452
+ updateSettingsForSource("userSettings", {
1453
+ alwaysThinkingEnabled: iu?.alwaysThinkingEnabled,
1454
+ fastMode: iu?.fastMode,
1455
+ promptSuggestionEnabled: iu?.promptSuggestionEnabled,
1456
+ autoUpdatesChannel: iu?.autoUpdatesChannel,
1457
+ minimumVersion: iu?.minimumVersion,
1458
+ language: iu?.language,
1459
+ ...{},
1460
+ syntaxHighlightingDisabled: iu?.syntaxHighlightingDisabled,
1461
+ permissions: iu?.permissions === undefined ? undefined : { ...iu.permissions, defaultMode: iu.permissions.defaultMode }
1462
+ });
1463
+ const ia = initialAppState;
1464
+ setAppState((prev) => ({
1465
+ ...prev,
1466
+ mainLoopModel: ia.mainLoopModel,
1467
+ mainLoopModelForSession: ia.mainLoopModelForSession,
1468
+ verbose: ia.verbose,
1469
+ thinkingEnabled: ia.thinkingEnabled,
1470
+ fastMode: ia.fastMode,
1471
+ promptSuggestionEnabled: ia.promptSuggestionEnabled,
1472
+ isBriefOnly: ia.isBriefOnly,
1473
+ replBridgeEnabled: ia.replBridgeEnabled,
1474
+ replBridgeOutboundOnly: ia.replBridgeOutboundOnly,
1475
+ settings: ia.settings,
1476
+ toolPermissionContext: transitionPlanAutoMode(prev.toolPermissionContext)
1477
+ }));
1478
+ if (getUserMsgOptIn() !== initialUserMsgOptIn) {
1479
+ setUserMsgOptIn(initialUserMsgOptIn);
1480
+ }
1481
+ }, [
1482
+ themeSetting,
1483
+ setTheme,
1484
+ initialLocalSettings,
1485
+ initialUserSettings,
1486
+ initialAppState,
1487
+ initialUserMsgOptIn,
1488
+ setAppState
1489
+ ]);
1490
+ const handleEscape = import_react4.useCallback(() => {
1491
+ if (showSubmenu !== null) {
1492
+ return;
1493
+ }
1494
+ if (isDirty.current) {
1495
+ revertChanges();
1496
+ }
1497
+ onClose("Config dialog dismissed", { display: "system" });
1498
+ }, [showSubmenu, revertChanges, onClose]);
1499
+ useKeybinding("confirm:no", handleEscape, {
1500
+ context: "Settings",
1501
+ isActive: showSubmenu === null && !isSearchMode && !headerFocused
1502
+ });
1503
+ useKeybinding("settings:close", handleSaveAndClose, {
1504
+ context: "Settings",
1505
+ isActive: showSubmenu === null && !isSearchMode && !headerFocused
1506
+ });
1507
+ const toggleSetting = import_react4.useCallback(() => {
1508
+ const setting = filteredSettingsItems[selectedIndex];
1509
+ if (!setting || !setting.onChange) {
1510
+ return;
1511
+ }
1512
+ if (setting.type === "boolean") {
1513
+ isDirty.current = true;
1514
+ setting.onChange(!setting.value);
1515
+ if (setting.id === "thinkingEnabled") {
1516
+ const newValue = !setting.value;
1517
+ const backToInitial = newValue === initialThinkingEnabled.current;
1518
+ if (backToInitial) {
1519
+ setShowThinkingWarning(false);
1520
+ } else if (context.messages.some((m) => m.type === "assistant")) {
1521
+ setShowThinkingWarning(true);
1522
+ }
1523
+ }
1524
+ return;
1525
+ }
1526
+ if (setting.id === "theme" || setting.id === "model" || setting.id === "teammateDefaultModel" || setting.id === "showExternalIncludesDialog" || setting.id === "outputStyle" || setting.id === "language") {
1527
+ switch (setting.id) {
1528
+ case "theme":
1529
+ setShowSubmenu("Theme");
1530
+ setTabsHidden(true);
1531
+ return;
1532
+ case "model":
1533
+ setShowSubmenu("Model");
1534
+ setTabsHidden(true);
1535
+ return;
1536
+ case "teammateDefaultModel":
1537
+ setShowSubmenu("TeammateModel");
1538
+ setTabsHidden(true);
1539
+ return;
1540
+ case "showExternalIncludesDialog":
1541
+ setShowSubmenu("ExternalIncludes");
1542
+ setTabsHidden(true);
1543
+ return;
1544
+ case "outputStyle":
1545
+ setShowSubmenu("OutputStyle");
1546
+ setTabsHidden(true);
1547
+ return;
1548
+ case "language":
1549
+ setShowSubmenu("Language");
1550
+ setTabsHidden(true);
1551
+ return;
1552
+ }
1553
+ }
1554
+ if (setting.id === "autoUpdatesChannel") {
1555
+ if (autoUpdaterDisabledReason) {
1556
+ setShowSubmenu("EnableAutoUpdates");
1557
+ setTabsHidden(true);
1558
+ return;
1559
+ }
1560
+ const currentChannel = settingsData?.autoUpdatesChannel ?? "latest";
1561
+ if (currentChannel === "latest") {
1562
+ setShowSubmenu("ChannelDowngrade");
1563
+ setTabsHidden(true);
1564
+ } else {
1565
+ isDirty.current = true;
1566
+ updateSettingsForSource("userSettings", {
1567
+ autoUpdatesChannel: "latest",
1568
+ minimumVersion: undefined
1569
+ });
1570
+ setSettingsData((prev) => ({
1571
+ ...prev,
1572
+ autoUpdatesChannel: "latest",
1573
+ minimumVersion: undefined
1574
+ }));
1575
+ logEvent("tengu_autoupdate_channel_changed", {
1576
+ channel: "latest"
1577
+ });
1578
+ }
1579
+ return;
1580
+ }
1581
+ if (setting.type === "enum") {
1582
+ isDirty.current = true;
1583
+ const currentIndex = setting.options.indexOf(setting.value);
1584
+ const nextIndex = (currentIndex + 1) % setting.options.length;
1585
+ setting.onChange(setting.options[nextIndex]);
1586
+ return;
1587
+ }
1588
+ }, [
1589
+ autoUpdaterDisabledReason,
1590
+ filteredSettingsItems,
1591
+ selectedIndex,
1592
+ settingsData?.autoUpdatesChannel,
1593
+ setTabsHidden
1594
+ ]);
1595
+ const moveSelection = (delta) => {
1596
+ setShowThinkingWarning(false);
1597
+ const newIndex = Math.max(0, Math.min(filteredSettingsItems.length - 1, selectedIndex + delta));
1598
+ setSelectedIndex(newIndex);
1599
+ adjustScrollOffset(newIndex);
1600
+ };
1601
+ useKeybindings({
1602
+ "select:previous": () => {
1603
+ if (selectedIndex === 0) {
1604
+ setShowThinkingWarning(false);
1605
+ setIsSearchMode(true);
1606
+ setScrollOffset(0);
1607
+ } else {
1608
+ moveSelection(-1);
1609
+ }
1610
+ },
1611
+ "select:next": () => moveSelection(1),
1612
+ "scroll:lineUp": () => moveSelection(-1),
1613
+ "scroll:lineDown": () => moveSelection(1),
1614
+ "select:accept": toggleSetting,
1615
+ "settings:search": () => {
1616
+ setIsSearchMode(true);
1617
+ setSearchQuery("");
1618
+ }
1619
+ }, {
1620
+ context: "Settings",
1621
+ isActive: showSubmenu === null && !isSearchMode && !headerFocused
1622
+ });
1623
+ const handleKeyDown = import_react4.useCallback((e) => {
1624
+ if (showSubmenu !== null)
1625
+ return;
1626
+ if (headerFocused)
1627
+ return;
1628
+ if (isSearchMode) {
1629
+ if (e.key === "escape") {
1630
+ e.preventDefault();
1631
+ if (searchQuery.length > 0) {
1632
+ setSearchQuery("");
1633
+ } else {
1634
+ setIsSearchMode(false);
1635
+ }
1636
+ return;
1637
+ }
1638
+ if (e.key === "return" || e.key === "down" || e.key === "wheeldown") {
1639
+ e.preventDefault();
1640
+ setIsSearchMode(false);
1641
+ setSelectedIndex(0);
1642
+ setScrollOffset(0);
1643
+ }
1644
+ return;
1645
+ }
1646
+ if (e.key === "left" || e.key === "right" || e.key === "tab") {
1647
+ e.preventDefault();
1648
+ toggleSetting();
1649
+ return;
1650
+ }
1651
+ if (e.ctrl || e.meta)
1652
+ return;
1653
+ if (e.key === "j" || e.key === "k" || e.key === "/")
1654
+ return;
1655
+ if (e.key.length === 1 && e.key !== " ") {
1656
+ e.preventDefault();
1657
+ setIsSearchMode(true);
1658
+ setSearchQuery(e.key);
1659
+ }
1660
+ }, [
1661
+ showSubmenu,
1662
+ headerFocused,
1663
+ isSearchMode,
1664
+ searchQuery,
1665
+ setSearchQuery,
1666
+ toggleSetting
1667
+ ]);
1668
+ return /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
1669
+ flexDirection: "column",
1670
+ width: "100%",
1671
+ tabIndex: 0,
1672
+ autoFocus: true,
1673
+ onKeyDown: handleKeyDown,
1674
+ children: showSubmenu === "Theme" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
1675
+ children: [
1676
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemePicker, {
1677
+ onThemeSelect: (setting) => {
1678
+ isDirty.current = true;
1679
+ setTheme(setting);
1680
+ setShowSubmenu(null);
1681
+ setTabsHidden(false);
1682
+ },
1683
+ onCancel: () => {
1684
+ setShowSubmenu(null);
1685
+ setTabsHidden(false);
1686
+ },
1687
+ hideEscToCancel: true,
1688
+ skipExitHandling: true
1689
+ }, undefined, false, undefined, this),
1690
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
1691
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1692
+ dimColor: true,
1693
+ italic: true,
1694
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
1695
+ children: [
1696
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
1697
+ shortcut: "Enter",
1698
+ action: "select"
1699
+ }, undefined, false, undefined, this),
1700
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
1701
+ action: "confirm:no",
1702
+ context: "Confirmation",
1703
+ fallback: "Esc",
1704
+ description: "cancel"
1705
+ }, undefined, false, undefined, this)
1706
+ ]
1707
+ }, undefined, true, undefined, this)
1708
+ }, undefined, false, undefined, this)
1709
+ }, undefined, false, undefined, this)
1710
+ ]
1711
+ }, undefined, true, undefined, this) : showSubmenu === "Model" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
1712
+ children: [
1713
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ModelPicker, {
1714
+ initial: mainLoopModel,
1715
+ onSelect: (model, _effort) => {
1716
+ isDirty.current = true;
1717
+ onChangeMainModelConfig(model);
1718
+ setShowSubmenu(null);
1719
+ setTabsHidden(false);
1720
+ },
1721
+ onCancel: () => {
1722
+ setShowSubmenu(null);
1723
+ setTabsHidden(false);
1724
+ },
1725
+ showFastModeNotice: isFastModeEnabled() ? isFastMode && isFastModeSupportedByModel(mainLoopModel) && isFastModeAvailable() : false
1726
+ }, undefined, false, undefined, this),
1727
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1728
+ dimColor: true,
1729
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
1730
+ children: [
1731
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
1732
+ shortcut: "Enter",
1733
+ action: "confirm"
1734
+ }, undefined, false, undefined, this),
1735
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
1736
+ action: "confirm:no",
1737
+ context: "Confirmation",
1738
+ fallback: "Esc",
1739
+ description: "cancel"
1740
+ }, undefined, false, undefined, this)
1741
+ ]
1742
+ }, undefined, true, undefined, this)
1743
+ }, undefined, false, undefined, this)
1744
+ ]
1745
+ }, undefined, true, undefined, this) : showSubmenu === "TeammateModel" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
1746
+ children: [
1747
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ModelPicker, {
1748
+ initial: globalConfig.teammateDefaultModel ?? null,
1749
+ skipSettingsWrite: true,
1750
+ headerText: "Default model for newly spawned teammates. The leader can override via the tool call's model parameter.",
1751
+ onSelect: (model, _effort) => {
1752
+ setShowSubmenu(null);
1753
+ setTabsHidden(false);
1754
+ if (globalConfig.teammateDefaultModel === undefined && model === null) {
1755
+ return;
1756
+ }
1757
+ isDirty.current = true;
1758
+ saveGlobalConfig((current) => current.teammateDefaultModel === model ? current : { ...current, teammateDefaultModel: model });
1759
+ setGlobalConfig({
1760
+ ...getGlobalConfig(),
1761
+ teammateDefaultModel: model
1762
+ });
1763
+ setChanges((prev) => ({
1764
+ ...prev,
1765
+ teammateDefaultModel: teammateModelDisplayString(model)
1766
+ }));
1767
+ logEvent("tengu_teammate_default_model_changed", {
1768
+ model
1769
+ });
1770
+ },
1771
+ onCancel: () => {
1772
+ setShowSubmenu(null);
1773
+ setTabsHidden(false);
1774
+ }
1775
+ }, undefined, false, undefined, this),
1776
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1777
+ dimColor: true,
1778
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
1779
+ children: [
1780
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
1781
+ shortcut: "Enter",
1782
+ action: "confirm"
1783
+ }, undefined, false, undefined, this),
1784
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
1785
+ action: "confirm:no",
1786
+ context: "Confirmation",
1787
+ fallback: "Esc",
1788
+ description: "cancel"
1789
+ }, undefined, false, undefined, this)
1790
+ ]
1791
+ }, undefined, true, undefined, this)
1792
+ }, undefined, false, undefined, this)
1793
+ ]
1794
+ }, undefined, true, undefined, this) : showSubmenu === "ExternalIncludes" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
1795
+ children: [
1796
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ClaudeMdExternalIncludesDialog, {
1797
+ onDone: () => {
1798
+ setShowSubmenu(null);
1799
+ setTabsHidden(false);
1800
+ },
1801
+ externalIncludes: getExternalClaudeMdIncludes(memoryFiles)
1802
+ }, undefined, false, undefined, this),
1803
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1804
+ dimColor: true,
1805
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
1806
+ children: [
1807
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
1808
+ shortcut: "Enter",
1809
+ action: "confirm"
1810
+ }, undefined, false, undefined, this),
1811
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
1812
+ action: "confirm:no",
1813
+ context: "Confirmation",
1814
+ fallback: "Esc",
1815
+ description: "disable external includes"
1816
+ }, undefined, false, undefined, this)
1817
+ ]
1818
+ }, undefined, true, undefined, this)
1819
+ }, undefined, false, undefined, this)
1820
+ ]
1821
+ }, undefined, true, undefined, this) : showSubmenu === "OutputStyle" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
1822
+ children: [
1823
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(OutputStylePicker, {
1824
+ initialStyle: currentOutputStyle,
1825
+ onComplete: (style) => {
1826
+ isDirty.current = true;
1827
+ setCurrentOutputStyle(style ?? DEFAULT_OUTPUT_STYLE_NAME);
1828
+ setShowSubmenu(null);
1829
+ setTabsHidden(false);
1830
+ updateSettingsForSource("localSettings", {
1831
+ outputStyle: style
1832
+ });
1833
+ logEvent("tengu_output_style_changed", {
1834
+ style: style ?? DEFAULT_OUTPUT_STYLE_NAME,
1835
+ source: "config_panel",
1836
+ settings_source: "localSettings"
1837
+ });
1838
+ },
1839
+ onCancel: () => {
1840
+ setShowSubmenu(null);
1841
+ setTabsHidden(false);
1842
+ }
1843
+ }, undefined, false, undefined, this),
1844
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1845
+ dimColor: true,
1846
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
1847
+ children: [
1848
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
1849
+ shortcut: "Enter",
1850
+ action: "confirm"
1851
+ }, undefined, false, undefined, this),
1852
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
1853
+ action: "confirm:no",
1854
+ context: "Confirmation",
1855
+ fallback: "Esc",
1856
+ description: "cancel"
1857
+ }, undefined, false, undefined, this)
1858
+ ]
1859
+ }, undefined, true, undefined, this)
1860
+ }, undefined, false, undefined, this)
1861
+ ]
1862
+ }, undefined, true, undefined, this) : showSubmenu === "Language" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
1863
+ children: [
1864
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(LanguagePicker, {
1865
+ initialLanguage: currentLanguage,
1866
+ onComplete: (language) => {
1867
+ isDirty.current = true;
1868
+ setCurrentLanguage(language);
1869
+ setShowSubmenu(null);
1870
+ setTabsHidden(false);
1871
+ updateSettingsForSource("userSettings", {
1872
+ language
1873
+ });
1874
+ logEvent("tengu_language_changed", {
1875
+ language: language ?? "default",
1876
+ source: "config_panel"
1877
+ });
1878
+ },
1879
+ onCancel: () => {
1880
+ setShowSubmenu(null);
1881
+ setTabsHidden(false);
1882
+ }
1883
+ }, undefined, false, undefined, this),
1884
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1885
+ dimColor: true,
1886
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
1887
+ children: [
1888
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
1889
+ shortcut: "Enter",
1890
+ action: "confirm"
1891
+ }, undefined, false, undefined, this),
1892
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
1893
+ action: "confirm:no",
1894
+ context: "Settings",
1895
+ fallback: "Esc",
1896
+ description: "cancel"
1897
+ }, undefined, false, undefined, this)
1898
+ ]
1899
+ }, undefined, true, undefined, this)
1900
+ }, undefined, false, undefined, this)
1901
+ ]
1902
+ }, undefined, true, undefined, this) : showSubmenu === "EnableAutoUpdates" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Dialog, {
1903
+ title: "Enable Auto-Updates",
1904
+ onCancel: () => {
1905
+ setShowSubmenu(null);
1906
+ setTabsHidden(false);
1907
+ },
1908
+ hideBorder: true,
1909
+ hideInputGuide: true,
1910
+ children: autoUpdaterDisabledReason?.type !== "config" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
1911
+ children: [
1912
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1913
+ children: autoUpdaterDisabledReason?.type === "env" ? "Auto-updates are controlled by an environment variable and cannot be changed here." : "Auto-updates are disabled in development builds."
1914
+ }, undefined, false, undefined, this),
1915
+ autoUpdaterDisabledReason?.type === "env" && /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1916
+ dimColor: true,
1917
+ children: [
1918
+ "Unset ",
1919
+ autoUpdaterDisabledReason.envVar,
1920
+ " to re-enable auto-updates."
1921
+ ]
1922
+ }, undefined, true, undefined, this)
1923
+ ]
1924
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Select, {
1925
+ options: [
1926
+ {
1927
+ label: "Enable with latest channel",
1928
+ value: "latest"
1929
+ },
1930
+ {
1931
+ label: "Enable with stable channel",
1932
+ value: "stable"
1933
+ }
1934
+ ],
1935
+ onChange: (channel) => {
1936
+ isDirty.current = true;
1937
+ setShowSubmenu(null);
1938
+ setTabsHidden(false);
1939
+ saveGlobalConfig((current) => ({
1940
+ ...current,
1941
+ autoUpdates: true
1942
+ }));
1943
+ setGlobalConfig({ ...getGlobalConfig(), autoUpdates: true });
1944
+ updateSettingsForSource("userSettings", {
1945
+ autoUpdatesChannel: channel,
1946
+ minimumVersion: undefined
1947
+ });
1948
+ setSettingsData((prev) => ({
1949
+ ...prev,
1950
+ autoUpdatesChannel: channel,
1951
+ minimumVersion: undefined
1952
+ }));
1953
+ logEvent("tengu_autoupdate_enabled", {
1954
+ channel
1955
+ });
1956
+ }
1957
+ }, undefined, false, undefined, this)
1958
+ }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ChannelDowngradeDialog, {
1959
+ currentVersion: "2.1.888",
1960
+ onChoice: (choice) => {
1961
+ setShowSubmenu(null);
1962
+ setTabsHidden(false);
1963
+ if (choice === "cancel") {
1964
+ return;
1965
+ }
1966
+ isDirty.current = true;
1967
+ const newSettings = {
1968
+ autoUpdatesChannel: "stable"
1969
+ };
1970
+ if (choice === "stay") {
1971
+ newSettings.minimumVersion = "2.1.888";
1972
+ }
1973
+ updateSettingsForSource("userSettings", newSettings);
1974
+ setSettingsData((prev) => ({
1975
+ ...prev,
1976
+ ...newSettings
1977
+ }));
1978
+ logEvent("tengu_autoupdate_channel_changed", {
1979
+ channel: "stable",
1980
+ minimum_version_set: choice === "stay"
1981
+ });
1982
+ }
1983
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
1984
+ flexDirection: "column",
1985
+ gap: 1,
1986
+ marginY: insideModal ? undefined : 1,
1987
+ children: [
1988
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(SearchBox, {
1989
+ query: searchQuery,
1990
+ isFocused: isSearchMode && !headerFocused,
1991
+ isTerminalFocused,
1992
+ cursorOffset: searchCursorOffset,
1993
+ placeholder: "Search settings\u2026"
1994
+ }, undefined, false, undefined, this),
1995
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
1996
+ flexDirection: "column",
1997
+ children: filteredSettingsItems.length === 0 ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
1998
+ dimColor: true,
1999
+ italic: true,
2000
+ children: [
2001
+ 'No settings match "',
2002
+ searchQuery,
2003
+ '"'
2004
+ ]
2005
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
2006
+ children: [
2007
+ scrollOffset > 0 && /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2008
+ dimColor: true,
2009
+ children: [
2010
+ figures_default.arrowUp,
2011
+ " ",
2012
+ scrollOffset,
2013
+ " more above"
2014
+ ]
2015
+ }, undefined, true, undefined, this),
2016
+ filteredSettingsItems.slice(scrollOffset, scrollOffset + maxVisible).map((setting, i) => {
2017
+ const actualIndex = scrollOffset + i;
2018
+ const isSelected = actualIndex === selectedIndex && !headerFocused && !isSearchMode;
2019
+ return /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(React3.Fragment, {
2020
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
2021
+ children: [
2022
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
2023
+ width: 44,
2024
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2025
+ color: isSelected ? "suggestion" : undefined,
2026
+ children: [
2027
+ isSelected ? figures_default.pointer : " ",
2028
+ " ",
2029
+ setting.label
2030
+ ]
2031
+ }, undefined, true, undefined, this)
2032
+ }, undefined, false, undefined, this),
2033
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
2034
+ children: setting.type === "boolean" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
2035
+ children: [
2036
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2037
+ color: isSelected ? "suggestion" : undefined,
2038
+ children: setting.value.toString()
2039
+ }, undefined, false, undefined, this),
2040
+ showThinkingWarning && setting.id === "thinkingEnabled" && /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2041
+ color: "warning",
2042
+ children: [
2043
+ " ",
2044
+ "Changing thinking mode mid-conversation will increase latency and may reduce quality."
2045
+ ]
2046
+ }, undefined, true, undefined, this)
2047
+ ]
2048
+ }, undefined, true, undefined, this) : setting.id === "theme" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2049
+ color: isSelected ? "suggestion" : undefined,
2050
+ children: THEME_LABELS[setting.value.toString()] ?? setting.value.toString()
2051
+ }, undefined, false, undefined, this) : setting.id === "notifChannel" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2052
+ color: isSelected ? "suggestion" : undefined,
2053
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(NotifChannelLabel, {
2054
+ value: setting.value.toString()
2055
+ }, undefined, false, undefined, this)
2056
+ }, undefined, false, undefined, this) : setting.id === "defaultPermissionMode" ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2057
+ color: isSelected ? "suggestion" : undefined,
2058
+ children: permissionModeTitle(setting.value)
2059
+ }, undefined, false, undefined, this) : setting.id === "autoUpdatesChannel" && autoUpdaterDisabledReason ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
2060
+ flexDirection: "column",
2061
+ children: [
2062
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2063
+ color: isSelected ? "suggestion" : undefined,
2064
+ children: "disabled"
2065
+ }, undefined, false, undefined, this),
2066
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2067
+ dimColor: true,
2068
+ children: [
2069
+ "(",
2070
+ formatAutoUpdaterDisabledReason(autoUpdaterDisabledReason),
2071
+ ")"
2072
+ ]
2073
+ }, undefined, true, undefined, this)
2074
+ ]
2075
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2076
+ color: isSelected ? "suggestion" : undefined,
2077
+ children: setting.value.toString()
2078
+ }, undefined, false, undefined, this)
2079
+ }, isSelected ? "selected" : "unselected", false, undefined, this)
2080
+ ]
2081
+ }, undefined, true, undefined, this)
2082
+ }, setting.id, false, undefined, this);
2083
+ }),
2084
+ scrollOffset + maxVisible < filteredSettingsItems.length && /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2085
+ dimColor: true,
2086
+ children: [
2087
+ figures_default.arrowDown,
2088
+ " ",
2089
+ filteredSettingsItems.length - scrollOffset - maxVisible,
2090
+ " ",
2091
+ "more below"
2092
+ ]
2093
+ }, undefined, true, undefined, this)
2094
+ ]
2095
+ }, undefined, true, undefined, this)
2096
+ }, undefined, false, undefined, this),
2097
+ headerFocused ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2098
+ dimColor: true,
2099
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
2100
+ children: [
2101
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
2102
+ shortcut: "\u2190/\u2192 tab",
2103
+ action: "switch"
2104
+ }, undefined, false, undefined, this),
2105
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
2106
+ shortcut: "\u2193",
2107
+ action: "return"
2108
+ }, undefined, false, undefined, this),
2109
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
2110
+ action: "confirm:no",
2111
+ context: "Settings",
2112
+ fallback: "Esc",
2113
+ description: "close"
2114
+ }, undefined, false, undefined, this)
2115
+ ]
2116
+ }, undefined, true, undefined, this)
2117
+ }, undefined, false, undefined, this) : isSearchMode ? /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2118
+ dimColor: true,
2119
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
2120
+ children: [
2121
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2122
+ children: "Type to filter"
2123
+ }, undefined, false, undefined, this),
2124
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
2125
+ shortcut: "Enter/\u2193",
2126
+ action: "select"
2127
+ }, undefined, false, undefined, this),
2128
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(KeyboardShortcutHint, {
2129
+ shortcut: "\u2191",
2130
+ action: "tabs"
2131
+ }, undefined, false, undefined, this),
2132
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
2133
+ action: "confirm:no",
2134
+ context: "Settings",
2135
+ fallback: "Esc",
2136
+ description: "clear"
2137
+ }, undefined, false, undefined, this)
2138
+ ]
2139
+ }, undefined, true, undefined, this)
2140
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2141
+ dimColor: true,
2142
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(Byline, {
2143
+ children: [
2144
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
2145
+ action: "select:accept",
2146
+ context: "Settings",
2147
+ fallback: "Space",
2148
+ description: "change"
2149
+ }, undefined, false, undefined, this),
2150
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
2151
+ action: "settings:close",
2152
+ context: "Settings",
2153
+ fallback: "Enter",
2154
+ description: "save"
2155
+ }, undefined, false, undefined, this),
2156
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
2157
+ action: "settings:search",
2158
+ context: "Settings",
2159
+ fallback: "/",
2160
+ description: "search"
2161
+ }, undefined, false, undefined, this),
2162
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ConfigurableShortcutHint, {
2163
+ action: "confirm:no",
2164
+ context: "Settings",
2165
+ fallback: "Esc",
2166
+ description: "cancel"
2167
+ }, undefined, false, undefined, this)
2168
+ ]
2169
+ }, undefined, true, undefined, this)
2170
+ }, undefined, false, undefined, this)
2171
+ ]
2172
+ }, undefined, true, undefined, this)
2173
+ }, undefined, false, undefined, this);
2174
+ }
2175
+ function teammateModelDisplayString(value) {
2176
+ if (value === undefined) {
2177
+ return modelDisplayString(getHardcodedTeammateModelFallback());
2178
+ }
2179
+ if (value === null)
2180
+ return "Default (leader's model)";
2181
+ return modelDisplayString(value);
2182
+ }
2183
+ function NotifChannelLabel({ value }) {
2184
+ switch (value) {
2185
+ case "auto":
2186
+ return "Auto";
2187
+ case "iterm2":
2188
+ return /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2189
+ children: [
2190
+ "iTerm2 ",
2191
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2192
+ dimColor: true,
2193
+ children: "(OSC 9)"
2194
+ }, undefined, false, undefined, this)
2195
+ ]
2196
+ }, undefined, true, undefined, this);
2197
+ case "terminal_bell":
2198
+ return /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2199
+ children: [
2200
+ "Terminal Bell ",
2201
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2202
+ dimColor: true,
2203
+ children: "(\\a)"
2204
+ }, undefined, false, undefined, this)
2205
+ ]
2206
+ }, undefined, true, undefined, this);
2207
+ case "kitty":
2208
+ return /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2209
+ children: [
2210
+ "Kitty ",
2211
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2212
+ dimColor: true,
2213
+ children: "(OSC 99)"
2214
+ }, undefined, false, undefined, this)
2215
+ ]
2216
+ }, undefined, true, undefined, this);
2217
+ case "ghostty":
2218
+ return /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2219
+ children: [
2220
+ "Ghostty ",
2221
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
2222
+ dimColor: true,
2223
+ children: "(OSC 777)"
2224
+ }, undefined, false, undefined, this)
2225
+ ]
2226
+ }, undefined, true, undefined, this);
2227
+ case "iterm2_with_bell":
2228
+ return "iTerm2 w/ Bell";
2229
+ case "notifications_disabled":
2230
+ return "Disabled";
2231
+ default:
2232
+ return value;
2233
+ }
2234
+ }
2235
+ var React3, import_react4, jsx_dev_runtime5, THEME_LABELS;
2236
+ var init_Config = __esm(() => {
2237
+ init_src();
2238
+ init_useKeybinding();
2239
+ init_figures();
2240
+ init_config();
2241
+ init_authPortable();
2242
+ init_config();
2243
+ init_source();
2244
+ init_PermissionMode();
2245
+ init_permissionSetup();
2246
+ init_log();
2247
+ init_analytics();
2248
+ init_bridgeEnabled();
2249
+ init_ThemePicker();
2250
+ init_AppState();
2251
+ init_ModelPicker();
2252
+ init_model();
2253
+ init_extraUsage();
2254
+ init_ClaudeMdExternalIncludesDialog();
2255
+ init_ChannelDowngradeDialog();
2256
+ init_src();
2257
+ init_CustomSelect();
2258
+ init_OutputStylePicker();
2259
+ init_LanguagePicker();
2260
+ init_claudemd();
2261
+ init_src();
2262
+ init_Tabs();
2263
+ init_ConfigurableShortcutHint();
2264
+ init_modalContext();
2265
+ init_SearchBox();
2266
+ init_ide();
2267
+ init_settings();
2268
+ init_state();
2269
+ init_outputStyles();
2270
+ init_envUtils();
2271
+ init_growthbook();
2272
+ init_agentSwarmsEnabled();
2273
+ init_teammateModeSnapshot();
2274
+ init_teammateModel();
2275
+ init_useSearchInput();
2276
+ init_useTerminalSize();
2277
+ init_fastMode();
2278
+ init_fullscreen();
2279
+ React3 = __toESM(require_react(), 1);
2280
+ import_react4 = __toESM(require_react(), 1);
2281
+ jsx_dev_runtime5 = __toESM(require_jsx_dev_runtime(), 1);
2282
+ THEME_LABELS = {
2283
+ auto: "Auto (match terminal)",
2284
+ dark: "Dark mode",
2285
+ light: "Light mode",
2286
+ "dark-daltonized": "Dark mode (colorblind-friendly)",
2287
+ "light-daltonized": "Light mode (colorblind-friendly)",
2288
+ "dark-ansi": "Dark mode (ANSI colors only)",
2289
+ "light-ansi": "Light mode (ANSI colors only)"
2290
+ };
2291
+ });
2292
+
2293
+ // src/components/Settings/Usage.tsx
2294
+ function LimitBar({
2295
+ title,
2296
+ limit,
2297
+ maxWidth,
2298
+ showTimeInReset = true,
2299
+ extraSubtext
2300
+ }) {
2301
+ const { utilization, resets_at } = limit;
2302
+ if (utilization === null) {
2303
+ return null;
2304
+ }
2305
+ const usedText = `${Math.floor(utilization)}% used`;
2306
+ let subtext;
2307
+ if (resets_at) {
2308
+ subtext = `Resets ${formatResetText(resets_at, true, showTimeInReset)}`;
2309
+ }
2310
+ if (extraSubtext) {
2311
+ if (subtext) {
2312
+ subtext = `${extraSubtext} \xB7 ${subtext}`;
2313
+ } else {
2314
+ subtext = extraSubtext;
2315
+ }
2316
+ }
2317
+ const maxBarWidth = 50;
2318
+ const usedLabelSpace = 12;
2319
+ if (maxWidth >= maxBarWidth + usedLabelSpace) {
2320
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
2321
+ flexDirection: "column",
2322
+ children: [
2323
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2324
+ bold: true,
2325
+ children: title
2326
+ }, undefined, false, undefined, this),
2327
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
2328
+ flexDirection: "row",
2329
+ gap: 1,
2330
+ children: [
2331
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ProgressBar, {
2332
+ ratio: utilization / 100,
2333
+ width: maxBarWidth,
2334
+ fillColor: "rate_limit_fill",
2335
+ emptyColor: "rate_limit_empty"
2336
+ }, undefined, false, undefined, this),
2337
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2338
+ children: usedText
2339
+ }, undefined, false, undefined, this)
2340
+ ]
2341
+ }, undefined, true, undefined, this),
2342
+ subtext && /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2343
+ dimColor: true,
2344
+ children: subtext
2345
+ }, undefined, false, undefined, this)
2346
+ ]
2347
+ }, undefined, true, undefined, this);
2348
+ } else {
2349
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
2350
+ flexDirection: "column",
2351
+ children: [
2352
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2353
+ children: [
2354
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2355
+ bold: true,
2356
+ children: title
2357
+ }, undefined, false, undefined, this),
2358
+ subtext && /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(jsx_dev_runtime6.Fragment, {
2359
+ children: [
2360
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2361
+ children: " "
2362
+ }, undefined, false, undefined, this),
2363
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2364
+ dimColor: true,
2365
+ children: [
2366
+ "\xB7 ",
2367
+ subtext
2368
+ ]
2369
+ }, undefined, true, undefined, this)
2370
+ ]
2371
+ }, undefined, true, undefined, this)
2372
+ ]
2373
+ }, undefined, true, undefined, this),
2374
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ProgressBar, {
2375
+ ratio: utilization / 100,
2376
+ width: maxWidth,
2377
+ fillColor: "rate_limit_fill",
2378
+ emptyColor: "rate_limit_empty"
2379
+ }, undefined, false, undefined, this),
2380
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2381
+ children: usedText
2382
+ }, undefined, false, undefined, this)
2383
+ ]
2384
+ }, undefined, true, undefined, this);
2385
+ }
2386
+ }
2387
+ function Usage() {
2388
+ const [utilization, setUtilization] = import_react5.useState(null);
2389
+ const [error, setError] = import_react5.useState(null);
2390
+ const [isLoading, setIsLoading] = import_react5.useState(true);
2391
+ const { columns } = useTerminalSize();
2392
+ const availableWidth = columns - 2;
2393
+ const maxWidth = Math.min(availableWidth, 80);
2394
+ const loadUtilization = React4.useCallback(async () => {
2395
+ setIsLoading(true);
2396
+ setError(null);
2397
+ try {
2398
+ const data = await fetchUtilization();
2399
+ setUtilization(data);
2400
+ } catch (err) {
2401
+ logError(err);
2402
+ const axiosError = err;
2403
+ const responseBody = axiosError.response?.data ? jsonStringify(axiosError.response.data) : undefined;
2404
+ setError(responseBody ? `Failed to load usage data: ${responseBody}` : "Failed to load usage data");
2405
+ } finally {
2406
+ setIsLoading(false);
2407
+ }
2408
+ }, []);
2409
+ import_react5.useEffect(() => {
2410
+ loadUtilization();
2411
+ }, [loadUtilization]);
2412
+ useKeybinding("settings:retry", () => {
2413
+ loadUtilization();
2414
+ }, { context: "Settings", isActive: !!error && !isLoading });
2415
+ if (error) {
2416
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
2417
+ flexDirection: "column",
2418
+ gap: 1,
2419
+ children: [
2420
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2421
+ color: "error",
2422
+ children: [
2423
+ "Error: ",
2424
+ error
2425
+ ]
2426
+ }, undefined, true, undefined, this),
2427
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2428
+ dimColor: true,
2429
+ children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(Byline, {
2430
+ children: [
2431
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ConfigurableShortcutHint, {
2432
+ action: "settings:retry",
2433
+ context: "Settings",
2434
+ fallback: "r",
2435
+ description: "retry"
2436
+ }, undefined, false, undefined, this),
2437
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ConfigurableShortcutHint, {
2438
+ action: "confirm:no",
2439
+ context: "Settings",
2440
+ fallback: "Esc",
2441
+ description: "cancel"
2442
+ }, undefined, false, undefined, this)
2443
+ ]
2444
+ }, undefined, true, undefined, this)
2445
+ }, undefined, false, undefined, this)
2446
+ ]
2447
+ }, undefined, true, undefined, this);
2448
+ }
2449
+ if (!utilization) {
2450
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
2451
+ flexDirection: "column",
2452
+ gap: 1,
2453
+ children: [
2454
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2455
+ dimColor: true,
2456
+ children: "Loading usage data\u2026"
2457
+ }, undefined, false, undefined, this),
2458
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2459
+ dimColor: true,
2460
+ children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ConfigurableShortcutHint, {
2461
+ action: "confirm:no",
2462
+ context: "Settings",
2463
+ fallback: "Esc",
2464
+ description: "cancel"
2465
+ }, undefined, false, undefined, this)
2466
+ }, undefined, false, undefined, this)
2467
+ ]
2468
+ }, undefined, true, undefined, this);
2469
+ }
2470
+ const subscriptionType = getSubscriptionType();
2471
+ const showSonnetBar = subscriptionType === "max" || subscriptionType === "team" || subscriptionType === null;
2472
+ const limits = [
2473
+ {
2474
+ title: "Current session",
2475
+ limit: utilization.five_hour
2476
+ },
2477
+ {
2478
+ title: "Current week (all models)",
2479
+ limit: utilization.seven_day
2480
+ },
2481
+ ...showSonnetBar ? [
2482
+ {
2483
+ title: "Current week (Sonnet only)",
2484
+ limit: utilization.seven_day_sonnet
2485
+ }
2486
+ ] : []
2487
+ ];
2488
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
2489
+ flexDirection: "column",
2490
+ gap: 1,
2491
+ width: "100%",
2492
+ children: [
2493
+ limits.some(({ limit }) => limit) || /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2494
+ dimColor: true,
2495
+ children: "/usage is only available for subscription plans."
2496
+ }, undefined, false, undefined, this),
2497
+ limits.map(({ title, limit }) => limit && /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(LimitBar, {
2498
+ title,
2499
+ limit,
2500
+ maxWidth
2501
+ }, title, false, undefined, this)),
2502
+ utilization.extra_usage && /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ExtraUsageSection, {
2503
+ extraUsage: utilization.extra_usage,
2504
+ maxWidth
2505
+ }, undefined, false, undefined, this),
2506
+ isEligibleForOverageCreditGrant() && /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(OverageCreditUpsell, {
2507
+ maxWidth
2508
+ }, undefined, false, undefined, this),
2509
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2510
+ dimColor: true,
2511
+ children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ConfigurableShortcutHint, {
2512
+ action: "confirm:no",
2513
+ context: "Settings",
2514
+ fallback: "Esc",
2515
+ description: "cancel"
2516
+ }, undefined, false, undefined, this)
2517
+ }, undefined, false, undefined, this)
2518
+ ]
2519
+ }, undefined, true, undefined, this);
2520
+ }
2521
+ function ExtraUsageSection({
2522
+ extraUsage: extraUsage2,
2523
+ maxWidth
2524
+ }) {
2525
+ const subscriptionType = getSubscriptionType();
2526
+ const isProOrMax = subscriptionType === "pro" || subscriptionType === "max";
2527
+ if (!isProOrMax) {
2528
+ return false;
2529
+ }
2530
+ if (!extraUsage2.is_enabled) {
2531
+ if (extraUsage.isEnabled()) {
2532
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
2533
+ flexDirection: "column",
2534
+ children: [
2535
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2536
+ bold: true,
2537
+ children: EXTRA_USAGE_SECTION_TITLE
2538
+ }, undefined, false, undefined, this),
2539
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2540
+ dimColor: true,
2541
+ children: "Extra usage not enabled \xB7 /extra-usage to enable"
2542
+ }, undefined, false, undefined, this)
2543
+ ]
2544
+ }, undefined, true, undefined, this);
2545
+ }
2546
+ return null;
2547
+ }
2548
+ if (extraUsage2.monthly_limit === null) {
2549
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
2550
+ flexDirection: "column",
2551
+ children: [
2552
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2553
+ bold: true,
2554
+ children: EXTRA_USAGE_SECTION_TITLE
2555
+ }, undefined, false, undefined, this),
2556
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
2557
+ dimColor: true,
2558
+ children: "Unlimited"
2559
+ }, undefined, false, undefined, this)
2560
+ ]
2561
+ }, undefined, true, undefined, this);
2562
+ }
2563
+ if (typeof extraUsage2.used_credits !== "number" || typeof extraUsage2.utilization !== "number") {
2564
+ return null;
2565
+ }
2566
+ const formattedUsedCredits = formatCost(extraUsage2.used_credits / 100, 2);
2567
+ const formattedMonthlyLimit = formatCost(extraUsage2.monthly_limit / 100, 2);
2568
+ const now = new Date;
2569
+ const oneMonthReset = new Date(now.getFullYear(), now.getMonth() + 1, 1);
2570
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(LimitBar, {
2571
+ title: EXTRA_USAGE_SECTION_TITLE,
2572
+ limit: {
2573
+ utilization: extraUsage2.utilization,
2574
+ resets_at: oneMonthReset.toISOString()
2575
+ },
2576
+ showTimeInReset: false,
2577
+ extraSubtext: `${formattedUsedCredits} / ${formattedMonthlyLimit} spent`,
2578
+ maxWidth
2579
+ }, undefined, false, undefined, this);
2580
+ }
2581
+ var React4, import_react5, jsx_dev_runtime6, EXTRA_USAGE_SECTION_TITLE = "Extra usage";
2582
+ var init_Usage = __esm(() => {
2583
+ init_extra_usage();
2584
+ init_cost_tracker();
2585
+ init_auth();
2586
+ init_useTerminalSize();
2587
+ init_src();
2588
+ init_useKeybinding();
2589
+ init_usage();
2590
+ init_format();
2591
+ init_log();
2592
+ init_slowOperations();
2593
+ init_ConfigurableShortcutHint();
2594
+ init_src();
2595
+ init_OverageCreditUpsell();
2596
+ React4 = __toESM(require_react(), 1);
2597
+ import_react5 = __toESM(require_react(), 1);
2598
+ jsx_dev_runtime6 = __toESM(require_jsx_dev_runtime(), 1);
2599
+ });
2600
+
2601
+ // src/components/Settings/Settings.tsx
2602
+ function Settings({
2603
+ onClose,
2604
+ context,
2605
+ defaultTab
2606
+ }) {
2607
+ const [selectedTab, setSelectedTab] = import_react6.useState(defaultTab);
2608
+ const [tabsHidden, setTabsHidden] = import_react6.useState(false);
2609
+ const [configOwnsEsc, setConfigOwnsEsc] = import_react6.useState(false);
2610
+ const [gatesOwnsEsc, setGatesOwnsEsc] = import_react6.useState(false);
2611
+ const insideModal = useIsInsideModal();
2612
+ const { rows } = useModalOrTerminalSize(useTerminalSize());
2613
+ const contentHeight = insideModal ? rows + 1 : Math.max(15, Math.min(Math.floor(rows * 0.8), 30));
2614
+ const [diagnosticsPromise] = import_react6.useState(() => buildDiagnostics().catch(() => []));
2615
+ useExitOnCtrlCDWithKeybindings();
2616
+ const handleEscape = () => {
2617
+ if (tabsHidden) {
2618
+ return;
2619
+ }
2620
+ onClose("Status dialog dismissed", { display: "system" });
2621
+ };
2622
+ useKeybinding("confirm:no", handleEscape, {
2623
+ context: "Settings",
2624
+ isActive: !tabsHidden && !(selectedTab === "Config" && configOwnsEsc) && !(selectedTab === "Gates" && gatesOwnsEsc)
2625
+ });
2626
+ const tabs = [
2627
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Tab, {
2628
+ title: "Status",
2629
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Status, {
2630
+ context,
2631
+ diagnosticsPromise
2632
+ }, undefined, false, undefined, this)
2633
+ }, "status", false, undefined, this),
2634
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Tab, {
2635
+ title: "Config",
2636
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(import_react6.Suspense, {
2637
+ fallback: null,
2638
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Config, {
2639
+ context,
2640
+ onClose,
2641
+ setTabsHidden,
2642
+ onIsSearchModeChange: setConfigOwnsEsc,
2643
+ contentHeight
2644
+ }, undefined, false, undefined, this)
2645
+ }, undefined, false, undefined, this)
2646
+ }, "config", false, undefined, this),
2647
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Tab, {
2648
+ title: "Usage",
2649
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Usage, {}, undefined, false, undefined, this)
2650
+ }, "usage", false, undefined, this),
2651
+ ...process.env.USER_TYPE === "ant" ? [
2652
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Tab, {
2653
+ title: "Gates",
2654
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Gates, {
2655
+ onOwnsEscChange: setGatesOwnsEsc,
2656
+ contentHeight
2657
+ }, undefined, false, undefined, this)
2658
+ }, "gates", false, undefined, this)
2659
+ ] : []
2660
+ ];
2661
+ return /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Pane, {
2662
+ color: "permission",
2663
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(Tabs, {
2664
+ color: "permission",
2665
+ selectedTab,
2666
+ onTabChange: setSelectedTab,
2667
+ hidden: tabsHidden,
2668
+ initialHeaderFocused: defaultTab !== "Config" && defaultTab !== "Gates",
2669
+ contentHeight: tabsHidden || insideModal ? undefined : contentHeight,
2670
+ children: tabs
2671
+ }, undefined, false, undefined, this)
2672
+ }, undefined, false, undefined, this);
2673
+ }
2674
+ var import_react6, jsx_dev_runtime7;
2675
+ var init_Settings = __esm(() => {
2676
+ init_useKeybinding();
2677
+ init_useExitOnCtrlCDWithKeybindings();
2678
+ init_useTerminalSize();
2679
+ init_modalContext();
2680
+ init_src();
2681
+ init_Tabs();
2682
+ init_Status();
2683
+ init_Config();
2684
+ init_Usage();
2685
+ import_react6 = __toESM(require_react(), 1);
2686
+ jsx_dev_runtime7 = __toESM(require_jsx_dev_runtime(), 1);
2687
+ });
2688
+
2689
+ export { Settings, init_Settings };