@caspian2026/agent-sdk 0.0.2

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