@costrict/csc 4.0.1

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