@shareai-lab/kode 2.0.1 → 2.0.3

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 (343) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +649 -25
  3. package/README.zh-CN.md +579 -0
  4. package/cli-acp.js +3 -17
  5. package/cli.js +5 -7
  6. package/dist/chunks/Doctor-M3J7GRTJ.js +12 -0
  7. package/dist/chunks/LogList-ISWZ6DDD.js +121 -0
  8. package/dist/chunks/LogList-ISWZ6DDD.js.map +7 -0
  9. package/dist/chunks/REPL-RQ6LO6S7.js +56 -0
  10. package/dist/chunks/ResumeConversation-6DMVBEGH.js +56 -0
  11. package/dist/chunks/agentLoader-FCRG3TFJ.js +31 -0
  12. package/dist/{agentsValidate-7LH4HTNR.js → chunks/agentsValidate-PEWMYN4Q.js} +97 -69
  13. package/dist/chunks/agentsValidate-PEWMYN4Q.js.map +7 -0
  14. package/dist/{ask-3NHFFUQG.js → chunks/ask-D7SOHJ6Z.js} +36 -44
  15. package/dist/chunks/ask-D7SOHJ6Z.js.map +7 -0
  16. package/dist/chunks/autoUpdater-CNESBOKO.js +19 -0
  17. package/dist/{chunk-AFFSCMYS.js → chunks/chunk-2JN5MY67.js} +12 -14
  18. package/dist/chunks/chunk-2JN5MY67.js.map +7 -0
  19. package/dist/chunks/chunk-2QONJ5MG.js +14 -0
  20. package/dist/chunks/chunk-2QONJ5MG.js.map +7 -0
  21. package/dist/chunks/chunk-2WEXPKHH.js +903 -0
  22. package/dist/chunks/chunk-2WEXPKHH.js.map +7 -0
  23. package/dist/{chunk-ARZSBOAO.js → chunks/chunk-3BYE3ME6.js} +717 -792
  24. package/dist/chunks/chunk-3BYE3ME6.js.map +7 -0
  25. package/dist/chunks/chunk-3JDNWX7W.js +1264 -0
  26. package/dist/chunks/chunk-3JDNWX7W.js.map +7 -0
  27. package/dist/chunks/chunk-3OEJVB5A.js +906 -0
  28. package/dist/chunks/chunk-3OEJVB5A.js.map +7 -0
  29. package/dist/chunks/chunk-3TNIOEBO.js +369 -0
  30. package/dist/chunks/chunk-3TNIOEBO.js.map +7 -0
  31. package/dist/chunks/chunk-4A46ZXMJ.js +67 -0
  32. package/dist/chunks/chunk-4A46ZXMJ.js.map +7 -0
  33. package/dist/{chunk-UHYRLID6.js → chunks/chunk-4ATBQOFO.js} +107 -55
  34. package/dist/chunks/chunk-4ATBQOFO.js.map +7 -0
  35. package/dist/chunks/chunk-4CRUCZR4.js +0 -0
  36. package/dist/{chunk-YC6LJCDE.js → chunks/chunk-4EO6SIQY.js} +32 -75
  37. package/dist/chunks/chunk-4EO6SIQY.js.map +7 -0
  38. package/dist/chunks/chunk-53M46S5I.js +64 -0
  39. package/dist/chunks/chunk-53M46S5I.js.map +7 -0
  40. package/dist/{chunk-JC6NCUG5.js → chunks/chunk-54KOYG5C.js} +0 -2
  41. package/dist/{chunk-EZXMVTDU.js → chunks/chunk-6BAS4WY6.js} +29 -45
  42. package/dist/chunks/chunk-6BAS4WY6.js.map +7 -0
  43. package/dist/{chunk-3IN27HA5.js → chunks/chunk-6KRRFSDN.js} +4 -6
  44. package/dist/chunks/chunk-6KRRFSDN.js.map +7 -0
  45. package/dist/chunks/chunk-6LJNZK4K.js +39 -0
  46. package/dist/chunks/chunk-6LJNZK4K.js.map +7 -0
  47. package/dist/chunks/chunk-6ZWEOSEI.js +666 -0
  48. package/dist/chunks/chunk-6ZWEOSEI.js.map +7 -0
  49. package/dist/chunks/chunk-77XDJMBP.js +3326 -0
  50. package/dist/chunks/chunk-77XDJMBP.js.map +7 -0
  51. package/dist/chunks/chunk-7RRW4NTB.js +6454 -0
  52. package/dist/chunks/chunk-7RRW4NTB.js.map +7 -0
  53. package/dist/chunks/chunk-7X3TW4JB.js +4520 -0
  54. package/dist/chunks/chunk-7X3TW4JB.js.map +7 -0
  55. package/dist/chunks/chunk-B3MW3YGY.js +1409 -0
  56. package/dist/chunks/chunk-B3MW3YGY.js.map +7 -0
  57. package/dist/chunks/chunk-BBJFHTBC.js +28 -0
  58. package/dist/chunks/chunk-BBJFHTBC.js.map +7 -0
  59. package/dist/chunks/chunk-BHDHXOXB.js +24 -0
  60. package/dist/chunks/chunk-BHDHXOXB.js.map +7 -0
  61. package/dist/{chunk-73WGVYLQ.js → chunks/chunk-BTA7SZ26.js} +152 -223
  62. package/dist/chunks/chunk-BTA7SZ26.js.map +7 -0
  63. package/dist/chunks/chunk-CDGRYGPZ.js +103 -0
  64. package/dist/chunks/chunk-CDGRYGPZ.js.map +7 -0
  65. package/dist/{chunk-S6HRABTA.js → chunks/chunk-CP6E5UG6.js} +1 -4
  66. package/dist/chunks/chunk-CP6E5UG6.js.map +7 -0
  67. package/dist/{chunk-QVLYOPO5.js → chunks/chunk-DQ4JHXMT.js} +462 -424
  68. package/dist/chunks/chunk-DQ4JHXMT.js.map +7 -0
  69. package/dist/chunks/chunk-DXD76CMV.js +208 -0
  70. package/dist/chunks/chunk-DXD76CMV.js.map +7 -0
  71. package/dist/chunks/chunk-GCQCAXJZ.js +0 -0
  72. package/dist/chunks/chunk-GELCZWMB.js +42 -0
  73. package/dist/chunks/chunk-GELCZWMB.js.map +7 -0
  74. package/dist/{chunk-K2CWOTI2.js → chunks/chunk-HJYOH4HC.js} +23 -18
  75. package/dist/chunks/chunk-HJYOH4HC.js.map +7 -0
  76. package/dist/chunks/chunk-HPYNW6TT.js +744 -0
  77. package/dist/chunks/chunk-HPYNW6TT.js.map +7 -0
  78. package/dist/{chunk-RZWOUA25.js → chunks/chunk-HRJ3ICQK.js} +59 -55
  79. package/dist/chunks/chunk-HRJ3ICQK.js.map +7 -0
  80. package/dist/{chunk-DZE5YA7L.js → chunks/chunk-IFCIADS3.js} +571 -573
  81. package/dist/chunks/chunk-IFCIADS3.js.map +7 -0
  82. package/dist/chunks/chunk-IN7XZ7BC.js +27 -0
  83. package/dist/chunks/chunk-IN7XZ7BC.js.map +7 -0
  84. package/dist/chunks/chunk-L7P4M4KW.js +193 -0
  85. package/dist/chunks/chunk-L7P4M4KW.js.map +7 -0
  86. package/dist/chunks/chunk-LB6TCPDI.js +0 -0
  87. package/dist/{chunk-3RUXVV4S.js → chunks/chunk-LOCXPQNJ.js} +1 -4
  88. package/dist/{chunk-3RUXVV4S.js.map → chunks/chunk-LOCXPQNJ.js.map} +2 -2
  89. package/dist/{chunk-7M2YN6TU.js → chunks/chunk-LOD5ZHCI.js} +213 -208
  90. package/dist/chunks/chunk-LOD5ZHCI.js.map +7 -0
  91. package/dist/{chunk-S3J2TLV6.js → chunks/chunk-M7P3QNRU.js} +1 -4
  92. package/dist/{chunk-S3J2TLV6.js.map → chunks/chunk-M7P3QNRU.js.map} +2 -2
  93. package/dist/chunks/chunk-PPHLQVL7.js +4234 -0
  94. package/dist/chunks/chunk-PPHLQVL7.js.map +7 -0
  95. package/dist/{chunk-ABLVTESJ.js → chunks/chunk-QAXE37B5.js} +1 -4
  96. package/dist/chunks/chunk-QAXE37B5.js.map +7 -0
  97. package/dist/chunks/chunk-QHQOBUF6.js +60 -0
  98. package/dist/chunks/chunk-QHQOBUF6.js.map +7 -0
  99. package/dist/{chunk-W7GRKO7Q.js → chunks/chunk-RPJXO7GG.js} +241 -214
  100. package/dist/chunks/chunk-RPJXO7GG.js.map +7 -0
  101. package/dist/{chunk-NPFOMITO.js → chunks/chunk-SWQV4KSY.js} +1 -4
  102. package/dist/{chunk-NPFOMITO.js.map → chunks/chunk-SWQV4KSY.js.map} +2 -2
  103. package/dist/chunks/chunk-SZLAPULP.js +28 -0
  104. package/dist/chunks/chunk-SZLAPULP.js.map +7 -0
  105. package/dist/{chunk-7U7L4NMD.js → chunks/chunk-T7RB5V5J.js} +23 -25
  106. package/dist/chunks/chunk-T7RB5V5J.js.map +7 -0
  107. package/dist/{chunk-HN4E4UUQ.js → chunks/chunk-TI2CTTMA.js} +25 -17
  108. package/dist/chunks/chunk-TI2CTTMA.js.map +7 -0
  109. package/dist/{chunk-ZVDRDPII.js → chunks/chunk-TNGVRTO5.js} +45 -20
  110. package/dist/chunks/chunk-TNGVRTO5.js.map +7 -0
  111. package/dist/chunks/chunk-TNWB3U5Y.js +2077 -0
  112. package/dist/chunks/chunk-TNWB3U5Y.js.map +7 -0
  113. package/dist/chunks/chunk-U2IHWPCU.js +12 -0
  114. package/dist/chunks/chunk-U2IHWPCU.js.map +7 -0
  115. package/dist/{chunk-KAA5BGMQ.js → chunks/chunk-UNOY3VJ2.js} +1 -4
  116. package/dist/{chunk-KAA5BGMQ.js.map → chunks/chunk-UNOY3VJ2.js.map} +2 -2
  117. package/dist/{chunk-MWRSY4X6.js → chunks/chunk-UVDJL6ZZ.js} +97 -58
  118. package/dist/chunks/chunk-UVDJL6ZZ.js.map +7 -0
  119. package/dist/chunks/chunk-VNCW4C2Z.js +13452 -0
  120. package/dist/chunks/chunk-VNCW4C2Z.js.map +7 -0
  121. package/dist/chunks/chunk-W5EGGA44.js +15 -0
  122. package/dist/chunks/chunk-W5EGGA44.js.map +7 -0
  123. package/dist/chunks/chunk-XR2W3MAM.js +1533 -0
  124. package/dist/chunks/chunk-XR2W3MAM.js.map +7 -0
  125. package/dist/{chunk-STSX7GIX.js → chunks/chunk-YIO5EBMQ.js} +423 -377
  126. package/dist/chunks/chunk-YIO5EBMQ.js.map +7 -0
  127. package/dist/chunks/chunk-ZBVLKZ5V.js +1062 -0
  128. package/dist/chunks/chunk-ZBVLKZ5V.js.map +7 -0
  129. package/dist/{chunk-E6YNABER.js → chunks/chunk-ZCLTZIVP.js} +1 -4
  130. package/dist/chunks/chunk-ZCLTZIVP.js.map +7 -0
  131. package/dist/chunks/client-SILZNM5N.js +42 -0
  132. package/dist/{config-RUSD6G5Y.js → chunks/config-25HRTPSP.js} +48 -10
  133. package/dist/chunks/cost-tracker-Z2UZT2J5.js +28 -0
  134. package/dist/{customCommands-TOIJFZAL.js → chunks/customCommands-TYMYZRG5.js} +11 -8
  135. package/dist/chunks/engine-MRVF6FK6.js +39 -0
  136. package/dist/{env-XGKBLU3D.js → chunks/env-TJ5NOBEB.js} +7 -5
  137. package/dist/{kodeAgentSessionId-X6XWQW7B.js → chunks/kodeAgentSessionId-VTNISJ2L.js} +2 -4
  138. package/dist/chunks/kodeAgentSessionLoad-YB2RKBGJ.js +15 -0
  139. package/dist/chunks/kodeAgentSessionResume-DZSIVKVA.js +13 -0
  140. package/dist/chunks/kodeAgentStreamJson-X5PLS2S6.js +11 -0
  141. package/dist/{kodeAgentStreamJsonSession-UGEZJJEB.js → chunks/kodeAgentStreamJsonSession-RDXM4XYF.js} +38 -24
  142. package/dist/chunks/kodeAgentStreamJsonSession-RDXM4XYF.js.map +7 -0
  143. package/dist/{chunk-4RTX4AG4.js → chunks/kodeAgentStructuredStdio-SVGDSB4P.js} +14 -9
  144. package/dist/chunks/kodeAgentStructuredStdio-SVGDSB4P.js.map +7 -0
  145. package/dist/{kodeHooks-QWM36A3D.js → chunks/kodeHooks-RVKYRJHG.js} +11 -9
  146. package/dist/{llm-ZUQC4WYM.js → chunks/llm-62N6T5ZT.js} +1734 -1526
  147. package/dist/chunks/llm-62N6T5ZT.js.map +7 -0
  148. package/dist/chunks/llmLazy-ZUSSE3ZA.js +13 -0
  149. package/dist/{mentionProcessor-EE3XFHCJ.js → chunks/mentionProcessor-RJW5UPJD.js} +46 -16
  150. package/dist/chunks/mentionProcessor-RJW5UPJD.js.map +7 -0
  151. package/dist/{messages-EOYQKPGM.js → chunks/messages-EEWWLPHN.js} +2 -6
  152. package/dist/chunks/model-5TIEKQPD.js +37 -0
  153. package/dist/{openai-RRCWW33N.js → chunks/openai-XXK3YZG4.js} +13 -10
  154. package/dist/{outputStyles-62Q3VH2J.js → chunks/outputStyles-FAJTXN2A.js} +6 -9
  155. package/dist/chunks/permissions-HO7INPWM.js +27 -0
  156. package/dist/{pluginRuntime-6ETCZ2LL.js → chunks/pluginRuntime-C7K5ULK2.js} +31 -48
  157. package/dist/chunks/pluginRuntime-C7K5ULK2.js.map +7 -0
  158. package/dist/chunks/pluginValidation-DAM7WRTC.js +20 -0
  159. package/dist/chunks/registry-XYJXMOA5.js +60 -0
  160. package/dist/chunks/responsesStreaming-JNGE2P3D.js +8 -0
  161. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js +577 -0
  162. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js.map +7 -0
  163. package/dist/chunks/server-REXXF5IK.js +46 -0
  164. package/dist/{skillMarketplace-3RXQBVOL.js → chunks/skillMarketplace-N4HVHNST.js} +8 -6
  165. package/dist/chunks/src-OROQIWP3.js +44 -0
  166. package/dist/chunks/src-QXLGGMUW.js +1647 -0
  167. package/dist/chunks/src-QXLGGMUW.js.map +7 -0
  168. package/dist/{cli-DOPVY2CW.js → chunks/src-SSDT6MVP.js} +2659 -3384
  169. package/dist/chunks/src-SSDT6MVP.js.map +7 -0
  170. package/dist/chunks/theme-YBJUIMWK.js +10 -0
  171. package/dist/{toolPermissionContext-65L65VEZ.js → chunks/toolPermissionContext-MOCTRR7N.js} +2 -4
  172. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js +18 -0
  173. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js.map +7 -0
  174. package/dist/chunks/uuid-6577SO6X.js +7 -0
  175. package/dist/chunks/uuid-6577SO6X.js.map +7 -0
  176. package/dist/chunks/webOnlyMode-ALXX7UQY.js +66 -0
  177. package/dist/chunks/webOnlyMode-ALXX7UQY.js.map +7 -0
  178. package/dist/entrypoints/cli.js +10 -0
  179. package/dist/entrypoints/cli.js.map +7 -0
  180. package/dist/entrypoints/daemon.js +10 -0
  181. package/dist/entrypoints/daemon.js.map +7 -0
  182. package/dist/entrypoints/mcp.js +71 -0
  183. package/dist/entrypoints/mcp.js.map +7 -0
  184. package/dist/index.js +6 -7
  185. package/dist/index.js.map +3 -3
  186. package/dist/sdk/client.cjs +391 -0
  187. package/dist/sdk/client.cjs.map +7 -0
  188. package/dist/sdk/client.js +364 -0
  189. package/dist/sdk/client.js.map +7 -0
  190. package/dist/sdk/core.cjs +19932 -0
  191. package/dist/sdk/core.cjs.map +7 -0
  192. package/dist/sdk/core.js +19893 -0
  193. package/dist/sdk/core.js.map +7 -0
  194. package/dist/sdk/daemon-client.cjs +257 -0
  195. package/dist/sdk/daemon-client.cjs.map +7 -0
  196. package/dist/sdk/daemon-client.js +221 -0
  197. package/dist/sdk/daemon-client.js.map +7 -0
  198. package/dist/sdk/protocol.cjs +170 -0
  199. package/dist/sdk/protocol.cjs.map +7 -0
  200. package/dist/sdk/protocol.js +140 -0
  201. package/dist/sdk/protocol.js.map +7 -0
  202. package/dist/sdk/runtime-node.cjs +236 -0
  203. package/dist/sdk/runtime-node.cjs.map +7 -0
  204. package/dist/sdk/runtime-node.js +222 -0
  205. package/dist/sdk/runtime-node.js.map +7 -0
  206. package/dist/sdk/runtime.cjs +17 -0
  207. package/dist/sdk/runtime.cjs.map +7 -0
  208. package/dist/sdk/runtime.js +0 -0
  209. package/dist/sdk/runtime.js.map +7 -0
  210. package/dist/sdk/tools.cjs +30300 -0
  211. package/dist/sdk/tools.cjs.map +7 -0
  212. package/dist/sdk/tools.js +30282 -0
  213. package/dist/sdk/tools.js.map +7 -0
  214. package/dist/webui/assets/index-5hlfByVS.css +1 -0
  215. package/dist/webui/assets/index-BR9lm1lA.js +82 -0
  216. package/dist/webui/index.html +28 -0
  217. package/package.json +93 -22
  218. package/scripts/binary-utils.cjs +12 -4
  219. package/scripts/cli-acp-wrapper.cjs +3 -17
  220. package/scripts/cli-wrapper.cjs +5 -7
  221. package/scripts/postinstall.js +8 -4
  222. package/dist/REPL-CW7AYLVL.js +0 -42
  223. package/dist/acp-VEPJ74LT.js +0 -1357
  224. package/dist/acp-VEPJ74LT.js.map +0 -7
  225. package/dist/agentsValidate-7LH4HTNR.js.map +0 -7
  226. package/dist/ask-3NHFFUQG.js.map +0 -7
  227. package/dist/autoUpdater-ITPIHCOI.js +0 -17
  228. package/dist/chunk-3IN27HA5.js.map +0 -7
  229. package/dist/chunk-4FX3IVPT.js +0 -164
  230. package/dist/chunk-4FX3IVPT.js.map +0 -7
  231. package/dist/chunk-4RTX4AG4.js.map +0 -7
  232. package/dist/chunk-5PDP7R6N.js +0 -515
  233. package/dist/chunk-5PDP7R6N.js.map +0 -7
  234. package/dist/chunk-73WGVYLQ.js.map +0 -7
  235. package/dist/chunk-7M2YN6TU.js.map +0 -7
  236. package/dist/chunk-7U7L4NMD.js.map +0 -7
  237. package/dist/chunk-ABLVTESJ.js.map +0 -7
  238. package/dist/chunk-AFFSCMYS.js.map +0 -7
  239. package/dist/chunk-ARZSBOAO.js.map +0 -7
  240. package/dist/chunk-CIG63V4E.js +0 -72
  241. package/dist/chunk-CIG63V4E.js.map +0 -7
  242. package/dist/chunk-CM3EGTG6.js +0 -1609
  243. package/dist/chunk-CM3EGTG6.js.map +0 -7
  244. package/dist/chunk-DZE5YA7L.js.map +0 -7
  245. package/dist/chunk-E6YNABER.js.map +0 -7
  246. package/dist/chunk-EZXMVTDU.js.map +0 -7
  247. package/dist/chunk-F2SJXUDI.js +0 -148
  248. package/dist/chunk-F2SJXUDI.js.map +0 -7
  249. package/dist/chunk-FC5ZCKBI.js +0 -30167
  250. package/dist/chunk-FC5ZCKBI.js.map +0 -7
  251. package/dist/chunk-HCBELH4J.js +0 -145
  252. package/dist/chunk-HCBELH4J.js.map +0 -7
  253. package/dist/chunk-HN4E4UUQ.js.map +0 -7
  254. package/dist/chunk-IZVMU4S2.js +0 -654
  255. package/dist/chunk-IZVMU4S2.js.map +0 -7
  256. package/dist/chunk-K2CWOTI2.js.map +0 -7
  257. package/dist/chunk-LC4TVOCZ.js +0 -835
  258. package/dist/chunk-LC4TVOCZ.js.map +0 -7
  259. package/dist/chunk-MIW7N2MY.js +0 -2613
  260. package/dist/chunk-MIW7N2MY.js.map +0 -7
  261. package/dist/chunk-MWRSY4X6.js.map +0 -7
  262. package/dist/chunk-ND3XWFO6.js +0 -34
  263. package/dist/chunk-ND3XWFO6.js.map +0 -7
  264. package/dist/chunk-QVLYOPO5.js.map +0 -7
  265. package/dist/chunk-RZWOUA25.js.map +0 -7
  266. package/dist/chunk-S6HRABTA.js.map +0 -7
  267. package/dist/chunk-STSX7GIX.js.map +0 -7
  268. package/dist/chunk-UHYRLID6.js.map +0 -7
  269. package/dist/chunk-UKHTVRJM.js +0 -47
  270. package/dist/chunk-UKHTVRJM.js.map +0 -7
  271. package/dist/chunk-UYXEDKOZ.js +0 -24
  272. package/dist/chunk-UYXEDKOZ.js.map +0 -7
  273. package/dist/chunk-W7GRKO7Q.js.map +0 -7
  274. package/dist/chunk-WVHORZQ5.js +0 -17
  275. package/dist/chunk-WVHORZQ5.js.map +0 -7
  276. package/dist/chunk-WWUWDNWW.js +0 -49
  277. package/dist/chunk-WWUWDNWW.js.map +0 -7
  278. package/dist/chunk-YC6LJCDE.js.map +0 -7
  279. package/dist/chunk-YXYYDIMI.js +0 -2931
  280. package/dist/chunk-YXYYDIMI.js.map +0 -7
  281. package/dist/chunk-ZVDRDPII.js.map +0 -7
  282. package/dist/cli-DOPVY2CW.js.map +0 -7
  283. package/dist/commands-2BF2CJ3A.js +0 -46
  284. package/dist/context-6FXPETYH.js +0 -30
  285. package/dist/costTracker-6SL26FDB.js +0 -19
  286. package/dist/kodeAgentSessionLoad-MITZADPB.js +0 -18
  287. package/dist/kodeAgentSessionResume-GVRWB4WO.js +0 -16
  288. package/dist/kodeAgentStreamJson-NXFN7TXH.js +0 -13
  289. package/dist/kodeAgentStreamJsonSession-UGEZJJEB.js.map +0 -7
  290. package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +0 -10
  291. package/dist/llm-ZUQC4WYM.js.map +0 -7
  292. package/dist/llmLazy-54QQHA54.js +0 -15
  293. package/dist/loader-FYHJQES5.js +0 -28
  294. package/dist/mcp-J332IKT3.js +0 -49
  295. package/dist/mentionProcessor-EE3XFHCJ.js.map +0 -7
  296. package/dist/model-FV3JDJKH.js +0 -30
  297. package/dist/pluginRuntime-6ETCZ2LL.js.map +0 -7
  298. package/dist/pluginValidation-I4YKUWGS.js +0 -17
  299. package/dist/prompts-ZLEKDD77.js +0 -48
  300. package/dist/query-VFRJPBGD.js +0 -50
  301. package/dist/responsesStreaming-AW344PQO.js +0 -10
  302. package/dist/ripgrep-3NTIKQYW.js +0 -17
  303. package/dist/state-P5G6CO5V.js +0 -16
  304. package/dist/theme-3LWP3BG7.js +0 -14
  305. package/dist/toolPermissionSettings-3ROBVTUK.js +0 -18
  306. package/dist/tools-RO7HSSE5.js +0 -47
  307. package/dist/userInput-JSBJRFSK.js +0 -311
  308. package/dist/userInput-JSBJRFSK.js.map +0 -7
  309. package/dist/uuid-QN2CNKKN.js +0 -9
  310. /package/dist/{REPL-CW7AYLVL.js.map → chunks/Doctor-M3J7GRTJ.js.map} +0 -0
  311. /package/dist/{autoUpdater-ITPIHCOI.js.map → chunks/REPL-RQ6LO6S7.js.map} +0 -0
  312. /package/dist/{chunk-JC6NCUG5.js.map → chunks/ResumeConversation-6DMVBEGH.js.map} +0 -0
  313. /package/dist/{commands-2BF2CJ3A.js.map → chunks/agentLoader-FCRG3TFJ.js.map} +0 -0
  314. /package/dist/{config-RUSD6G5Y.js.map → chunks/autoUpdater-CNESBOKO.js.map} +0 -0
  315. /package/dist/{context-6FXPETYH.js.map → chunks/chunk-4CRUCZR4.js.map} +0 -0
  316. /package/dist/{costTracker-6SL26FDB.js.map → chunks/chunk-54KOYG5C.js.map} +0 -0
  317. /package/dist/{customCommands-TOIJFZAL.js.map → chunks/chunk-GCQCAXJZ.js.map} +0 -0
  318. /package/dist/{env-XGKBLU3D.js.map → chunks/chunk-LB6TCPDI.js.map} +0 -0
  319. /package/dist/{kodeAgentSessionId-X6XWQW7B.js.map → chunks/client-SILZNM5N.js.map} +0 -0
  320. /package/dist/{kodeAgentSessionLoad-MITZADPB.js.map → chunks/config-25HRTPSP.js.map} +0 -0
  321. /package/dist/{kodeAgentSessionResume-GVRWB4WO.js.map → chunks/cost-tracker-Z2UZT2J5.js.map} +0 -0
  322. /package/dist/{kodeAgentStreamJson-NXFN7TXH.js.map → chunks/customCommands-TYMYZRG5.js.map} +0 -0
  323. /package/dist/{kodeAgentStructuredStdio-HGWJT7CU.js.map → chunks/engine-MRVF6FK6.js.map} +0 -0
  324. /package/dist/{kodeHooks-QWM36A3D.js.map → chunks/env-TJ5NOBEB.js.map} +0 -0
  325. /package/dist/{llmLazy-54QQHA54.js.map → chunks/kodeAgentSessionId-VTNISJ2L.js.map} +0 -0
  326. /package/dist/{loader-FYHJQES5.js.map → chunks/kodeAgentSessionLoad-YB2RKBGJ.js.map} +0 -0
  327. /package/dist/{mcp-J332IKT3.js.map → chunks/kodeAgentSessionResume-DZSIVKVA.js.map} +0 -0
  328. /package/dist/{messages-EOYQKPGM.js.map → chunks/kodeAgentStreamJson-X5PLS2S6.js.map} +0 -0
  329. /package/dist/{model-FV3JDJKH.js.map → chunks/kodeHooks-RVKYRJHG.js.map} +0 -0
  330. /package/dist/{openai-RRCWW33N.js.map → chunks/llmLazy-ZUSSE3ZA.js.map} +0 -0
  331. /package/dist/{outputStyles-62Q3VH2J.js.map → chunks/messages-EEWWLPHN.js.map} +0 -0
  332. /package/dist/{pluginValidation-I4YKUWGS.js.map → chunks/model-5TIEKQPD.js.map} +0 -0
  333. /package/dist/{prompts-ZLEKDD77.js.map → chunks/openai-XXK3YZG4.js.map} +0 -0
  334. /package/dist/{query-VFRJPBGD.js.map → chunks/outputStyles-FAJTXN2A.js.map} +0 -0
  335. /package/dist/{responsesStreaming-AW344PQO.js.map → chunks/permissions-HO7INPWM.js.map} +0 -0
  336. /package/dist/{ripgrep-3NTIKQYW.js.map → chunks/pluginValidation-DAM7WRTC.js.map} +0 -0
  337. /package/dist/{skillMarketplace-3RXQBVOL.js.map → chunks/registry-XYJXMOA5.js.map} +0 -0
  338. /package/dist/{state-P5G6CO5V.js.map → chunks/responsesStreaming-JNGE2P3D.js.map} +0 -0
  339. /package/dist/{theme-3LWP3BG7.js.map → chunks/server-REXXF5IK.js.map} +0 -0
  340. /package/dist/{toolPermissionContext-65L65VEZ.js.map → chunks/skillMarketplace-N4HVHNST.js.map} +0 -0
  341. /package/dist/{toolPermissionSettings-3ROBVTUK.js.map → chunks/src-OROQIWP3.js.map} +0 -0
  342. /package/dist/{tools-RO7HSSE5.js.map → chunks/theme-YBJUIMWK.js.map} +0 -0
  343. /package/dist/{uuid-QN2CNKKN.js.map → chunks/toolPermissionContext-MOCTRR7N.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../apps/cli/src/ui/hooks/useExitOnCtrlCD.ts", "../../apps/cli/src/ui/hooks/useDoublePress.ts", "../../apps/cli/src/utils/terminal.ts", "../../apps/cli/src/ui/components/Onboarding.tsx", "../../apps/cli/src/ui/components/Logo.tsx", "../../apps/cli/src/ui/components/StructuredDiff.tsx", "../../apps/cli/src/ui/components/ModelSelector/ModelSelector.tsx", "../../apps/cli/src/ui/components/ModelSelector/ModelSelectorView.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/ApiKeyScreen.tsx", "../../apps/cli/src/ui/components/TextInput.tsx", "../../apps/cli/src/ui/hooks/useTextInput.ts", "../../apps/cli/src/utils/Cursor/MeasuredText.ts", "../../apps/cli/src/utils/Cursor.ts", "../../apps/cli/src/ui/hooks/useTextInputMapping.ts", "../../packages/core/src/utils/imagePaste.ts", "../../apps/cli/src/ui/hooks/useTextInputTryImagePaste.ts", "../../apps/cli/src/ui/components/TextInputBracketedPaste.ts", "../../apps/cli/src/ui/ui/components/model-selector/screens/BaseUrlScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/ConfirmationScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/options.ts", "../../apps/cli/src/ui/ui/components/model-selector/screens/ConnectionTestScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/ContextLengthScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/ModelInputScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/ModelParamsScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/ModelSelectionScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/PartnerCodingPlansScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/PartnerProvidersScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/ProviderSelectionScreen.tsx", "../../apps/cli/src/ui/ui/components/model-selector/ScreenContainer.tsx", "../../apps/cli/src/ui/ui/components/model-selector/screens/ResourceNameScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorController.tsx", "../../apps/cli/src/ui/ui/components/model-selector/printModelConfig.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorInput.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorMenus.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorModelOptions.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorState.tsx", "../../apps/cli/src/ui/ui/components/model-selector/state.ts", "../../apps/cli/src/ui/ui/components/model-selector/actions/connectionTest/openAICompatibility.ts", "../../apps/cli/src/ui/ui/components/model-selector/actions/connectionTest/testChatEndpoint.ts", "../../apps/cli/src/ui/ui/components/model-selector/actions/connectionTest/testProviderSpecificEndpoint.ts", "../../apps/cli/src/ui/ui/components/model-selector/actions/connectionTest/performConnectionTest.ts", "../../apps/cli/src/ui/ui/components/model-selector/actions/connectionTest/runConnectionTestFlow.ts", "../../apps/cli/src/ui/ui/components/model-selector/actions/providerSelection.ts", "../../apps/cli/src/ui/ui/components/model-selector/actions/saveConfiguration.ts", "../../apps/cli/src/ui/ui/components/model-selector/actions/fetchModels.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/anthropic.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/baiduQianfan.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/customOpenAI.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/deepseek.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/gemini.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/glm.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/kimi.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/minimax.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/qwen.ts", "../../apps/cli/src/ui/ui/components/model-selector/modelFetchers/siliconflow.ts", "../../apps/cli/src/ui/components/ModelSelector/fetchOllamaModels.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorModelFlow.tsx", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorTextHandlers.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorActions.tsx", "../../apps/cli/src/ui/ui/components/model-selector/useEscapeNavigation.ts"],
4
+ "sourcesContent": ["import { useInput } from 'ink'\nimport { useDoublePress } from './useDoublePress'\nimport { useState } from 'react'\n\ntype ExitState = {\n pending: boolean\n keyName: 'Ctrl-C' | 'Ctrl-D' | null\n}\n\nexport function useExitOnCtrlCD(onExit: () => void): ExitState {\n const [exitState, setExitState] = useState<ExitState>({\n pending: false,\n keyName: null,\n })\n\n const handleCtrlC = useDoublePress(\n pending => setExitState({ pending, keyName: 'Ctrl-C' }),\n onExit,\n )\n const handleCtrlD = useDoublePress(\n pending => setExitState({ pending, keyName: 'Ctrl-D' }),\n onExit,\n )\n\n useInput((input, key) => {\n if (key.ctrl && input === 'c') handleCtrlC()\n if (key.ctrl && input === 'd') handleCtrlD()\n })\n\n return exitState\n}\n", "// Creates a function that calls one function on the first call and another\n// function on the second call within a certain timeout\n\nimport { useRef } from 'react'\n\nexport const DOUBLE_PRESS_TIMEOUT_MS = 2000\n\nexport function useDoublePress(\n setPending: (pending: boolean) => void,\n onDoublePress: () => void,\n onFirstPress?: () => void,\n): () => void {\n const lastPressRef = useRef<number>(0)\n const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined)\n\n return () => {\n const now = Date.now()\n const timeSinceLastPress = now - lastPressRef.current\n\n // For this to count as a double-call, be sure to check that\n // timeoutRef.current exists so we don't trigger on triple call\n // (e.g. of Esc to clear the text input)\n if (timeSinceLastPress <= DOUBLE_PRESS_TIMEOUT_MS && timeoutRef.current) {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = undefined\n }\n onDoublePress()\n setPending(false)\n } else {\n onFirstPress?.()\n setPending(true)\n timeoutRef.current = setTimeout(\n () => setPending(false),\n DOUBLE_PRESS_TIMEOUT_MS,\n )\n }\n\n lastPressRef.current = now\n }\n}\n", "import { safeParseJSON } from '#core/utils/json'\nimport { logError } from '#core/utils/log'\n\nexport function setTerminalTitle(title: string): void {\n if (process.platform === 'win32') {\n process.title = title ? `\u2733 ${title}` : title\n } else {\n process.stdout.write(`\\x1b]0;${title ? `\u2733 ${title}` : ''}\\x07`)\n }\n}\n\nexport async function updateTerminalTitle(message: string): Promise<void> {\n try {\n const { queryQuick } = await import('#core/ai/llm')\n const result = await queryQuick({\n systemPrompt: [\n \"Analyze if this message indicates a new conversation topic. If it does, extract a 2-3 word title that captures the new topic. Format your response as a JSON object with two fields: 'isNewTopic' (boolean) and 'title' (string, or null if isNewTopic is false). Only include these fields, no other text.\",\n ],\n userPrompt: message,\n enablePromptCaching: true,\n })\n\n const content = result.message.content\n .filter(_ => _.type === 'text')\n .map(_ => _.text)\n .join('')\n\n const response = safeParseJSON(content)\n if (\n response &&\n typeof response === 'object' &&\n 'isNewTopic' in response &&\n 'title' in response\n ) {\n if (response.isNewTopic && response.title) {\n setTerminalTitle(response.title as string)\n }\n }\n } catch (error) {\n logError(error)\n }\n}\n\nexport function clearTerminal(): Promise<void> {\n return new Promise(resolve => {\n process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H', () => {\n resolve()\n })\n })\n}\n", "import React, { useState } from 'react'\nimport { PRODUCT_NAME } from '#core/constants/product'\nimport { Box, Newline, Text, useInput } from 'ink'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n DEFAULT_GLOBAL_CONFIG,\n ProviderType,\n} from '#core/utils/config'\nimport { OrderedList } from '@inkjs/ui'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { MIN_LOGO_WIDTH } from './Logo'\nimport { Select } from './CustomSelect/select'\nimport { StructuredDiff } from './StructuredDiff'\nimport { getTheme, type ThemeNames } from '#core/utils/theme'\nimport { clearTerminal } from '#cli-utils/terminal'\nimport { PressEnterToContinue } from './PressEnterToContinue'\nimport { ModelSelector } from './ModelSelector'\ntype StepId = 'theme' | 'usage' | 'providers' | 'model'\n\ninterface OnboardingStep {\n id: StepId\n component: React.ReactNode\n}\n\ntype Props = {\n onDone(): void\n}\n\nexport function Onboarding({ onDone }: Props): React.ReactNode {\n const [currentStepIndex, setCurrentStepIndex] = useState(0)\n const [showModelSelector, setShowModelSelector] = useState(false)\n const config = getGlobalConfig()\n\n const [selectedTheme, setSelectedTheme] = useState(\n DEFAULT_GLOBAL_CONFIG.theme,\n )\n const theme = getTheme()\n function goToNextStep() {\n if (currentStepIndex < steps.length - 1) {\n const nextIndex = currentStepIndex + 1\n setCurrentStepIndex(nextIndex)\n }\n }\n\n function handleThemeSelection(newTheme: string) {\n saveGlobalConfig({\n ...config,\n theme: newTheme as ThemeNames,\n })\n goToNextStep()\n }\n\n function handleThemePreview(newTheme: string) {\n setSelectedTheme(newTheme as ThemeNames)\n }\n\n function handleProviderSelectionDone() {\n // After model selection is done, go to the next step\n goToNextStep()\n }\n\n function handleModelSelectionDone() {\n // After final model selection is done, complete onboarding\n onDone()\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput(\n async (_, key) => {\n const currentStep = steps[currentStepIndex]\n if (\n key.return &&\n currentStep &&\n ['usage', 'providers', 'model'].includes(currentStep.id)\n ) {\n if (currentStep.id === 'model') {\n // Navigate to ModelSelector component\n setShowModelSelector(true)\n } else if (currentStepIndex === steps.length - 1) {\n onDone()\n } else {\n // HACK: for some reason there's now a jump here otherwise :(\n await clearTerminal()\n goToNextStep()\n }\n }\n },\n { isActive: !showModelSelector },\n )\n\n // Define all onboarding steps\n const themeStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text>Let&apos;s get started.</Text>\n <Box flexDirection=\"column\">\n <Text bold>Choose the option that looks best when you select it:</Text>\n <Text dimColor>To change this later, run /config</Text>\n </Box>\n <Select\n options={[\n { label: 'Light text', value: 'dark' },\n { label: 'Dark text', value: 'light' },\n {\n label: 'Light text (colorblind-friendly)',\n value: 'dark-daltonized',\n },\n {\n label: 'Dark text (colorblind-friendly)',\n value: 'light-daltonized',\n },\n ]}\n onFocus={handleThemePreview}\n onChange={handleThemeSelection}\n />\n <Box flexDirection=\"column\">\n <Box\n paddingLeft={1}\n marginRight={1}\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexDirection=\"column\"\n >\n <StructuredDiff\n patch={{\n oldStart: 1,\n newStart: 1,\n oldLines: 3,\n newLines: 3,\n lines: [\n 'function greet() {',\n '- console.log(\"Hello, World!\");',\n '+ console.log(\"Hello, anon!\");',\n '}',\n ],\n }}\n dim={false}\n width={40}\n overrideTheme={selectedTheme}\n />\n </Box>\n </Box>\n </Box>\n )\n\n const providersStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n Next, let's select your preferred AI provider and model.\n </Text>\n </Box>\n <ModelSelector\n onDone={handleProviderSelectionDone}\n skipModelType={true}\n isOnboarding={true}\n />\n </Box>\n )\n\n const usageStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text bold>Using {PRODUCT_NAME} effectively:</Text>\n <Box flexDirection=\"column\" width={70}>\n <OrderedList>\n <OrderedList.Item>\n <Text>\n Start in your project directory\n <Newline />\n <Text color={theme.secondaryText}>\n Files are automatically added to context when needed.\n </Text>\n <Newline />\n </Text>\n </OrderedList.Item>\n <OrderedList.Item>\n <Text>\n Use {PRODUCT_NAME} as a development partner\n <Newline />\n <Text color={theme.secondaryText}>\n Get help with file analysis, editing, bash commands,\n <Newline />\n and git history.\n <Newline />\n </Text>\n </Text>\n </OrderedList.Item>\n <OrderedList.Item>\n <Text>\n Provide clear context\n <Newline />\n <Text color={theme.secondaryText}>\n Be as specific as you would with another engineer. <Newline />\n The better the context, the better the results. <Newline />\n </Text>\n </Text>\n </OrderedList.Item>\n </OrderedList>\n </Box>\n <PressEnterToContinue />\n </Box>\n )\n\n const modelStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text bold>Configure your models:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text>\n You can customize which models {PRODUCT_NAME} uses for different\n tasks.\n <Newline />\n <Text color={theme.secondaryText}>\n Let's set up your preferred models for large and small tasks.\n </Text>\n </Text>\n <Box marginTop={1}>\n <Text>\n Press <Text color={theme.suggestion}>Enter</Text> to continue to the\n model selection screen.\n </Text>\n </Box>\n </Box>\n <PressEnterToContinue />\n </Box>\n )\n\n const steps: OnboardingStep[] = []\n steps.push({ id: 'theme', component: themeStep })\n steps.push({ id: 'usage', component: usageStep })\n\n steps.push({ id: 'model', component: modelStep })\n\n // If we're showing the model selector screen, render it directly\n if (showModelSelector) {\n return (\n <ModelSelector\n onDone={handleModelSelectionDone}\n skipModelType={true}\n isOnboarding={true}\n />\n )\n }\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n {PRODUCT_NAME}{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n {steps[currentStepIndex]?.component}\n </Box>\n </>\n </Box>\n )\n}\n\nexport function WelcomeBox(): React.ReactNode {\n const theme = getTheme()\n return (\n <Box\n borderColor={theme.kode}\n borderStyle=\"round\"\n paddingX={1}\n width={MIN_LOGO_WIDTH}\n >\n <Text>\n <Text color={theme.kode}>\u273B</Text> Welcome to{' '}\n <Text bold>{PRODUCT_NAME}</Text> research preview!\n </Text>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { ASCII_LOGO } from '#core/constants/product'\n\nexport const MIN_LOGO_WIDTH = 60\n\nexport function Logo({\n mcpClients,\n updateBannerVersion,\n terminalColumns,\n}: {\n mcpClients: any[]\n isDefaultModel?: boolean\n updateBannerVersion?: string | null\n updateBannerCommands?: string[] | null\n terminalColumns?: number\n}): React.ReactNode {\n const theme = getTheme()\n\n const connected = mcpClients.filter((c) => c.type === 'connected')\n const failed = mcpClients.filter((c) => c.type !== 'connected')\n\n // Generate separator that fits terminal width\n const separatorWidth = Math.min(terminalColumns || 80, 80) - 16\n const separator = '\u2500'.repeat(Math.max(separatorWidth, 20))\n\n return (\n <Box flexDirection=\"column\">\n {/* Update notice at very top */}\n {updateBannerVersion && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">\n Update {updateBannerVersion} available: npm i -g @shareai-lab/kode@latest\n </Text>\n </Box>\n )}\n\n {/* ASCII Logo */}\n <Box flexDirection=\"column\">\n <Text color={theme.kode}>{ASCII_LOGO}</Text>\n </Box>\n\n {/* Quick tips - single line */}\n <Box marginTop={1}>\n <Text dimColor>\n /init{' '}/help{' '}\n <Text color={theme.bashBorder}>!</Text>shell{' '}\n <Text color={theme.notingBorder}>#</Text>note{' '}\n @file{' '}opt+m{' '}opt+g\n </Text>\n </Box>\n\n {/* MCP Servers section */}\n <Box flexDirection=\"column\" marginTop={2}>\n <Text dimColor>\u2500\u2500 MCP Servers {separator}</Text>\n <Box marginTop={1} paddingLeft={3}>\n {mcpClients.length === 0 ? (\n <Text dimColor>No servers configured - run: kode mcp add {\"<name>\"}</Text>\n ) : (\n <>\n {connected.map((c) => (\n <Text key={c.name}>\n <Text color={theme.success}>{c.name}</Text>\n <Text dimColor> </Text>\n </Text>\n ))}\n {failed.map((c) => (\n <Text key={c.name}>\n <Text color={theme.error}>{c.name}</Text>\n <Text dimColor> </Text>\n </Text>\n ))}\n </>\n )}\n </Box>\n </Box>\n </Box>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { Hunk } from 'diff'\nimport { getTheme, ThemeNames } from '#core/utils/theme'\nimport { useMemo } from 'react'\nimport { wrapText } from '#core/utils/format'\n\ntype Props = {\n patch: Hunk\n dim: boolean\n width: number\n overrideTheme?: ThemeNames // custom theme for previews\n key?: React.Key\n}\n\nexport function StructuredDiff({\n patch,\n dim,\n width,\n overrideTheme,\n}: Props): React.ReactNode {\n const diff = useMemo(\n () => formatDiff(patch.lines, patch.oldStart, width, dim, overrideTheme),\n [patch.lines, patch.oldStart, width, dim, overrideTheme],\n )\n\n return diff.map((_, i) => <Box key={i}>{_}</Box>)\n}\n\nfunction formatDiff(\n lines: string[],\n startingLineNumber: number,\n width: number,\n dim: boolean,\n overrideTheme?: ThemeNames,\n): React.ReactNode[] {\n const theme = getTheme(overrideTheme)\n\n const ls = numberDiffLines(\n lines.map(code => {\n if (code.startsWith('+')) {\n return {\n code: ' ' + code.slice(1),\n i: 0,\n type: 'add',\n }\n }\n if (code.startsWith('-')) {\n return {\n code: ' ' + code.slice(1),\n i: 0,\n type: 'remove',\n }\n }\n return { code, i: 0, type: 'nochange' }\n }),\n startingLineNumber,\n )\n\n const maxLineNumber = Math.max(...ls.map(({ i }) => i))\n const maxWidth = maxLineNumber.toString().length\n\n return ls.flatMap(({ type, code, i }) => {\n const wrappedLines = wrapText(code, width - maxWidth)\n return wrappedLines.map((line, lineIndex) => {\n const key = `${type}-${i}-${lineIndex}`\n switch (type) {\n case 'add':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n backgroundColor={\n dim ? theme.diff.addedDimmed : theme.diff.added\n }\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n case 'remove':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n backgroundColor={\n dim ? theme.diff.removedDimmed : theme.diff.removed\n }\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n case 'nochange':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n }\n })\n })\n}\n\nfunction LineNumber({\n i,\n width,\n}: {\n i: number | undefined\n width: number\n}): React.ReactNode {\n return (\n <Text color={getTheme().secondaryText}>\n {i !== undefined ? i.toString().padStart(width) : ' '.repeat(width)}{' '}\n </Text>\n )\n}\n\nfunction numberDiffLines(\n diff: { code: string; type: string }[],\n startLine: number,\n): { code: string; type: string; i: number }[] {\n let i = startLine\n const result: { code: string; type: string; i: number }[] = []\n const queue = [...diff]\n\n while (queue.length > 0) {\n const { code, type } = queue.shift()!\n const line = {\n code: code,\n type,\n i,\n }\n\n // Update counters based on change type\n switch (type) {\n case 'nochange':\n i++\n result.push(line)\n break\n case 'add':\n i++\n result.push(line)\n break\n case 'remove': {\n result.push(line)\n let numRemoved = 0\n while (queue[0]?.type === 'remove') {\n i++\n const { code, type } = queue.shift()!\n const line = {\n code: code,\n type,\n i,\n }\n result.push(line)\n numRemoved++\n }\n i -= numRemoved\n break\n }\n }\n }\n\n return result\n}\n", "import type { ReactNode } from 'react'\nimport * as React from 'react'\nimport type { ModelSelectorProps } from './types'\nimport { ModelSelectorView } from './ModelSelectorView'\nimport { useModelSelectorController } from './useModelSelectorController'\n\nexport function ModelSelector(props: ModelSelectorProps): ReactNode {\n const viewProps = useModelSelectorController(props)\n return <ModelSelectorView {...viewProps} />\n}\n", "import * as React from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport { ApiKeyScreen } from '#ui-ink/ui/components/model-selector/screens/ApiKeyScreen'\nimport { BaseUrlScreen } from '#ui-ink/ui/components/model-selector/screens/BaseUrlScreen'\nimport { ConfirmationScreen } from '#ui-ink/ui/components/model-selector/screens/ConfirmationScreen'\nimport { ConnectionTestScreen } from '#ui-ink/ui/components/model-selector/screens/ConnectionTestScreen'\nimport { ContextLengthScreen } from '#ui-ink/ui/components/model-selector/screens/ContextLengthScreen'\nimport { ModelInputScreen } from '#ui-ink/ui/components/model-selector/screens/ModelInputScreen'\nimport { ModelParamsScreen } from '#ui-ink/ui/components/model-selector/screens/ModelParamsScreen'\nimport { ModelSelectionScreen } from '#ui-ink/ui/components/model-selector/screens/ModelSelectionScreen'\nimport { PartnerCodingPlansScreen } from '#ui-ink/ui/components/model-selector/screens/PartnerCodingPlansScreen'\nimport { PartnerProvidersScreen } from '#ui-ink/ui/components/model-selector/screens/PartnerProvidersScreen'\nimport { ProviderSelectionScreen } from '#ui-ink/ui/components/model-selector/screens/ProviderSelectionScreen'\nimport { ResourceNameScreen } from '#ui-ink/ui/components/model-selector/screens/ResourceNameScreen'\nimport type { Option, ModelSelectorViewProps } from './viewTypes'\n\nexport function ModelSelectorView(\n props: ModelSelectorViewProps,\n): React.ReactNode {\n function getSafeVisibleOptionCount(\n requestedCount: number,\n optionLength: number,\n reservedLines: number = 10,\n ): number {\n const rows = props.terminalRows\n const available = Math.max(1, rows - reservedLines)\n return Math.max(1, Math.min(requestedCount, optionLength, available))\n }\n\n function renderWindowedOptions(\n options: Option[],\n focusedIndex: number,\n maxVisible: number,\n ) {\n if (options.length === 0) {\n return (\n <Text color={props.theme.secondaryText}>No options available.</Text>\n )\n }\n\n const visibleCount = Math.max(1, Math.min(maxVisible, options.length))\n const half = Math.floor(visibleCount / 2)\n const start = Math.max(\n 0,\n Math.min(focusedIndex - half, Math.max(0, options.length - visibleCount)),\n )\n const end = Math.min(options.length, start + visibleCount)\n const showUp = start > 0\n const showDown = end < options.length\n\n return (\n <Box flexDirection=\"column\" gap={0}>\n {showUp && (\n <Text color={props.theme.secondaryText}>{figures.arrowUp} More</Text>\n )}\n {options.slice(start, end).map((opt, idx) => {\n const absoluteIndex = start + idx\n const isFocused = absoluteIndex === focusedIndex\n return (\n <Box key={opt.value} flexDirection=\"row\">\n <Text\n color={isFocused ? props.theme.kode : props.theme.secondaryText}\n >\n {isFocused ? figures.pointer : ' '}\n </Text>\n <Text\n color={isFocused ? props.theme.text : props.theme.secondaryText}\n bold={isFocused}\n >\n {' '}\n {opt.label}\n </Text>\n </Box>\n )\n })}\n {showDown && (\n <Text color={props.theme.secondaryText}>\n {figures.arrowDown} More\n </Text>\n )}\n </Box>\n )\n }\n\n if (props.currentScreen === 'apiKey') {\n return (\n <ApiKeyScreen\n theme={props.theme}\n exitState={props.exitState}\n selectedProvider={props.selectedProvider}\n apiKey={props.apiKey}\n cursorOffset={props.cursorOffset}\n handleApiKeyChange={props.handleApiKeyChange}\n handleApiKeySubmit={props.handleApiKeySubmit}\n handleCursorOffsetChange={props.handleCursorOffsetChange}\n apiKeyCleanedNotification={props.apiKeyCleanedNotification}\n isLoadingModels={props.isLoadingModels}\n providerBaseUrl={props.providerBaseUrl}\n modelLoadError={props.modelLoadError}\n formatApiKeyDisplay={props.formatApiKeyDisplay}\n getProviderLabel={props.getProviderLabel}\n />\n )\n }\n\n if (props.currentScreen === 'model') {\n return (\n <ModelSelectionScreen\n theme={props.theme}\n exitState={props.exitState}\n selectedProvider={props.selectedProvider}\n availableModels={props.availableModels}\n modelSearchQuery={props.modelSearchQuery}\n modelSearchCursorOffset={props.modelSearchCursorOffset}\n handleModelSearchChange={props.handleModelSearchChange}\n handleModelSearchCursorOffsetChange={\n props.handleModelSearchCursorOffsetChange\n }\n modelOptions={props.modelOptions}\n handleModelSelection={props.handleModelSelection}\n getProviderLabel={props.getProviderLabel}\n />\n )\n }\n\n if (props.currentScreen === 'modelParams') {\n const formFields = props.getFormFieldsForModelParams()\n return (\n <ModelParamsScreen\n theme={props.theme}\n exitState={props.exitState}\n selectedModel={props.selectedModel}\n formFields={formFields}\n activeFieldIndex={props.activeFieldIndex}\n setActiveFieldIndex={props.setActiveFieldIndex}\n maxTokens={props.maxTokens}\n setMaxTokens={props.setMaxTokens}\n setSelectedMaxTokensPreset={props.setSelectedMaxTokensPreset}\n setMaxTokensCursorOffset={props.setMaxTokensCursorOffset}\n reasoningEffortOptions={props.reasoningEffortOptions}\n reasoningEffort={props.reasoningEffort}\n setReasoningEffort={props.setReasoningEffort}\n />\n )\n }\n\n if (props.currentScreen === 'resourceName') {\n return (\n <ResourceNameScreen\n theme={props.theme}\n exitState={props.exitState}\n resourceName={props.resourceName}\n setResourceName={props.setResourceName}\n handleResourceNameSubmit={props.handleResourceNameSubmit}\n resourceNameCursorOffset={props.resourceNameCursorOffset}\n setResourceNameCursorOffset={props.setResourceNameCursorOffset}\n />\n )\n }\n\n if (props.currentScreen === 'baseUrl') {\n return (\n <BaseUrlScreen\n theme={props.theme}\n exitState={props.exitState}\n selectedProvider={props.selectedProvider}\n isLoadingModels={props.isLoadingModels}\n modelLoadError={props.modelLoadError}\n customBaseUrl={props.customBaseUrl}\n setCustomBaseUrl={props.setCustomBaseUrl}\n handleCustomBaseUrlSubmit={props.handleCustomBaseUrlSubmit}\n customBaseUrlCursorOffset={props.customBaseUrlCursorOffset}\n setCustomBaseUrlCursorOffset={props.setCustomBaseUrlCursorOffset}\n providerBaseUrl={props.providerBaseUrl}\n setProviderBaseUrl={props.setProviderBaseUrl}\n handleProviderBaseUrlSubmit={props.handleProviderBaseUrlSubmit}\n providerBaseUrlCursorOffset={props.providerBaseUrlCursorOffset}\n setProviderBaseUrlCursorOffset={props.setProviderBaseUrlCursorOffset}\n />\n )\n }\n\n if (props.currentScreen === 'modelInput') {\n return (\n <ModelInputScreen\n theme={props.theme}\n exitState={props.exitState}\n selectedProvider={props.selectedProvider}\n customModelName={props.customModelName}\n setCustomModelName={props.setCustomModelName}\n handleCustomModelSubmit={props.handleCustomModelSubmit}\n customModelNameCursorOffset={props.customModelNameCursorOffset}\n setCustomModelNameCursorOffset={props.setCustomModelNameCursorOffset}\n />\n )\n }\n\n if (props.currentScreen === 'contextLength') {\n return (\n <ContextLengthScreen\n theme={props.theme}\n exitState={props.exitState}\n contextLength={props.contextLength}\n />\n )\n }\n\n if (props.currentScreen === 'connectionTest') {\n return (\n <ConnectionTestScreen\n theme={props.theme}\n exitState={props.exitState}\n selectedProvider={props.selectedProvider}\n getProviderLabel={props.getProviderLabel}\n isTestingConnection={props.isTestingConnection}\n connectionTestResult={props.connectionTestResult}\n />\n )\n }\n\n if (props.currentScreen === 'confirmation') {\n return (\n <ConfirmationScreen\n theme={props.theme}\n exitState={props.exitState}\n selectedProvider={props.selectedProvider}\n selectedModel={props.selectedModel}\n resourceName={props.resourceName}\n ollamaBaseUrl={props.ollamaBaseUrl}\n customBaseUrl={props.customBaseUrl}\n apiKey={props.apiKey}\n maxTokens={props.maxTokens}\n contextLength={props.contextLength}\n supportsReasoningEffort={props.supportsReasoningEffort}\n reasoningEffort={props.reasoningEffort}\n validationError={props.validationError}\n formatApiKeyDisplay={props.formatApiKeyDisplay}\n getProviderLabel={props.getProviderLabel}\n />\n )\n }\n\n if (props.currentScreen === 'partnerProviders') {\n return (\n <PartnerProvidersScreen\n theme={props.theme}\n exitState={props.exitState}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n partnerProviderOptions={props.partnerProviderOptions}\n partnerProviderFocusIndex={props.partnerProviderFocusIndex}\n partnerReservedLines={props.partnerReservedLines}\n getSafeVisibleOptionCount={getSafeVisibleOptionCount}\n renderWindowedOptions={renderWindowedOptions}\n />\n )\n }\n\n if (props.currentScreen === 'partnerCodingPlans') {\n return (\n <PartnerCodingPlansScreen\n theme={props.theme}\n exitState={props.exitState}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n tightLayout={props.tightLayout}\n compactLayout={props.compactLayout}\n codingPlanOptions={props.codingPlanOptions}\n codingPlanFocusIndex={props.codingPlanFocusIndex}\n codingReservedLines={props.codingReservedLines}\n getSafeVisibleOptionCount={getSafeVisibleOptionCount}\n renderWindowedOptions={renderWindowedOptions}\n />\n )\n }\n\n return (\n <ProviderSelectionScreen\n theme={props.theme}\n exitState={props.exitState}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n mainMenuOptions={props.mainMenuOptions}\n providerFocusIndex={props.providerFocusIndex}\n providerReservedLines={props.providerReservedLines}\n getSafeVisibleOptionCount={getSafeVisibleOptionCount}\n renderWindowedOptions={renderWindowedOptions}\n />\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport TextInput from '#ui-ink/components/TextInput'\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n selectedProvider: string\n apiKey: string\n cursorOffset: number\n handleApiKeyChange: (value: string) => void\n handleApiKeySubmit: (value: string) => void\n handleCursorOffsetChange: (offset: number) => void\n apiKeyCleanedNotification: boolean\n isLoadingModels: boolean\n providerBaseUrl: string\n modelLoadError: string | null\n formatApiKeyDisplay: (key: string) => string\n getProviderLabel: (provider: string, modelCount: number) => string\n}\n\nexport function ApiKeyScreen({\n theme,\n exitState,\n selectedProvider,\n apiKey,\n cursorOffset,\n handleApiKeyChange,\n handleApiKeySubmit,\n handleCursorOffsetChange,\n apiKeyCleanedNotification,\n isLoadingModels,\n providerBaseUrl,\n modelLoadError,\n formatApiKeyDisplay,\n getProviderLabel,\n}: Props) {\n const modelTypeText = 'this model profile'\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n API Key Setup{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n Enter your {getProviderLabel(selectedProvider, 0).split(' (')[0]}{' '}\n API key for {modelTypeText}:\n </Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This key will be stored locally and used to access the{' '}\n {selectedProvider} API.\n <Newline />\n Your key is never sent to our servers.\n <Newline />\n <Newline />\n {selectedProvider === 'kimi' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.moonshot.cn/console/api-keys\n </Text>\n </>\n )}\n {selectedProvider === 'deepseek' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.deepseek.com/api_keys\n </Text>\n </>\n )}\n {selectedProvider === 'siliconflow' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://cloud.siliconflow.cn/i/oJWsm6io\n </Text>\n </>\n )}\n {selectedProvider === 'qwen' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://bailian.console.aliyun.com/?tab=model#/api-key\n </Text>\n </>\n )}\n {selectedProvider === 'glm' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://open.bigmodel.cn (API Keys section)\n </Text>\n </>\n )}\n {selectedProvider === 'glm-coding' && (\n <>\n \uD83D\uDCA1 This is for GLM Coding Plan API.{' '}\n <Text color={theme.suggestion}>\n Use the same API key as regular GLM\n </Text>\n <Newline />\n <Text dimColor>\n Note: This uses a special endpoint for coding tasks.\n </Text>\n </>\n )}\n {selectedProvider === 'minimax' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://www.minimax.io/platform/user-center/basic-information\n </Text>\n </>\n )}\n {selectedProvider === 'minimax-coding' && (\n <>\n \uD83D\uDCA1 Get your Coding Plan API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.minimaxi.com/user-center/payment/coding-plan\n </Text>\n <Newline />\n <Text dimColor>\n Note: This requires a MiniMax Coding Plan subscription.\n </Text>\n </>\n )}\n {selectedProvider === 'baidu-qianfan' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://console.bce.baidu.com/iam/#/iam/accesslist\n </Text>\n </>\n )}\n {selectedProvider === 'anthropic' && (\n <>\uD83D\uDCA1 Get your API key from your provider dashboard.</>\n )}\n {selectedProvider === 'openai' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.openai.com/api-keys\n </Text>\n </>\n )}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n <Box>\n <TextInput\n placeholder=\"Paste your API key here...\"\n value={apiKey}\n onChange={handleApiKeyChange}\n onSubmit={handleApiKeySubmit}\n mask=\"*\"\n columns={80}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={handleCursorOffsetChange}\n showCursor={true}\n />\n </Box>\n\n {apiKey && (\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>\n Key: {formatApiKeyDisplay(apiKey)} ({apiKey.length} chars)\n </Text>\n </Box>\n )}\n </Box>\n\n {apiKeyCleanedNotification && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n \u2713 API key cleaned: removed line breaks and trimmed whitespace\n </Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion} dimColor={!apiKey}>\n [Submit API Key]\n </Text>\n <Text> - Press Enter to validate and continue</Text>\n </Text>\n </Box>\n\n {isLoadingModels && (\n <Box marginTop={1}>\n <Text color={theme.suggestion}>\n Validating API key and fetching models...\n </Text>\n {providerBaseUrl && (\n <Text dimColor>Endpoint: {providerBaseUrl}/v1/models</Text>\n )}\n </Box>\n )}\n\n {modelLoadError && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"red\">\u274C API Key Validation Failed</Text>\n <Text color=\"red\">{modelLoadError}</Text>\n {providerBaseUrl && (\n <Box marginTop={1}>\n <Text dimColor>\n Attempted endpoint: {providerBaseUrl}/v1/models\n </Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text color={theme.warning}>\n Please check your API key and try again.\n </Text>\n </Box>\n </Box>\n )}\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue,{' '}\n <Text color={theme.suggestion}>Tab</Text> to{' '}\n {selectedProvider === 'anthropic' ||\n selectedProvider === 'kimi' ||\n selectedProvider === 'deepseek' ||\n selectedProvider === 'qwen' ||\n selectedProvider === 'glm' ||\n selectedProvider === 'glm-coding' ||\n selectedProvider === 'minimax' ||\n selectedProvider === 'minimax-coding' ||\n selectedProvider === 'baidu-qianfan' ||\n selectedProvider === 'siliconflow' ||\n selectedProvider === 'custom-openai'\n ? 'skip to manual model input'\n : 'skip using a key'}\n , or <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Text, useInput } from 'ink'\nimport chalk from 'chalk'\nimport { useTextInput } from '#ui-ink/hooks/useTextInput'\nimport { getTheme } from '#core/utils/theme'\nimport { type Key } from 'ink'\nimport { shouldAggregatePasteChunk } from '#core/utils/paste'\nimport {\n useBracketedPasteMode,\n useBracketedPasteSequences,\n} from './TextInputBracketedPaste'\nimport type { Props } from './TextInput.types'\nexport type { Props } from './TextInput.types'\n\nexport default function TextInput({\n value: originalValue,\n placeholder = '',\n focus = true,\n mask,\n multiline = false,\n highlightPastedText = false,\n showCursor = true,\n onChange,\n onSubmit,\n onExit,\n onHistoryUp,\n onHistoryDown,\n onExitMessage,\n onMessage,\n onHistoryReset,\n columns,\n onImagePaste,\n onPaste,\n isDimmed = false,\n disableCursorMovementForUpDownKeys = false,\n onSpecialKey,\n cursorOffset,\n onChangeCursorOffset,\n}: Props) {\n const { onInput, renderedValue } = useTextInput({\n value: originalValue,\n onChange,\n onSubmit,\n onExit,\n onExitMessage,\n onMessage,\n onHistoryReset,\n onHistoryUp,\n onHistoryDown,\n focus,\n mask,\n multiline,\n cursorChar: showCursor ? ' ' : '',\n highlightPastedText,\n invert: chalk.inverse,\n themeText: (text: string) => chalk.hex(getTheme().text)(text),\n columns,\n onImagePaste,\n disableCursorMovementForUpDownKeys,\n externalOffset: cursorOffset,\n onOffsetChange: onChangeCursorOffset,\n })\n\n useBracketedPasteMode()\n\n // Paste detection state\n const [pasteState, setPasteState] = React.useState<{\n chunks: string[]\n timeoutId: ReturnType<typeof setTimeout> | null\n }>({ chunks: [], timeoutId: null })\n\n const handleBracketedPasteSequences = useBracketedPasteSequences({\n insertText: (text: string) => onInput(text, {} as Key),\n onPaste,\n })\n\n const resetPasteTimeout = (\n currentTimeoutId: ReturnType<typeof setTimeout> | null,\n ) => {\n if (currentTimeoutId) {\n clearTimeout(currentTimeoutId)\n }\n return setTimeout(() => {\n setPasteState(({ chunks }) => {\n const pastedText = chunks.join('')\n // Schedule callback after current render to avoid state updates during render\n Promise.resolve().then(() => onPaste!(pastedText))\n return { chunks: [], timeoutId: null }\n })\n }, 500)\n }\n\n const wrappedOnInput = (input: string, key: Key): void => {\n // Some terminals (e.g. kitty/wezterm with CSI-u keyboard protocol) encode Enter with modifiers as CSI u sequences.\n // Example: ESC[13;3u (Alt/Option+Enter). Ink may strip the leading ESC.\n if (/^(?:\\x1b)?\\[13;2(?:u|~)$/.test(input)) {\n // Treat modified Enter as plain Enter to avoid leaking raw CSI sequences into the input.\n onInput('\\r', { ...key, return: true, meta: false, shift: false } as Key)\n return\n }\n if (/^(?:\\x1b)?\\[13;(?:3|4)(?:u|~)$/.test(input)) {\n // Alt/Option+Enter (or Shift+Alt/Option+Enter) -> newline in multiline chat inputs.\n onInput('\\r', { ...key, return: true, meta: true } as Key)\n return\n }\n\n // Some terminals/keybindings emit LF (\"\\n\") for modified Enter. In multiline inputs, insert a newline.\n // In single-line inputs, treat it as Enter for compatibility.\n if (input === '\\n') {\n if (multiline) {\n onInput('\\n', key)\n return\n }\n\n onInput('\\r', { ...key, return: true } as Key)\n return\n }\n\n // Some terminals/keybindings emit ESC+CR/LF for Option+Enter. Depending on the decoder,\n // it may arrive as a raw 2-char sequence; treat it as Meta+Enter for multiline inputs.\n if (input === '\\x1b\\r' || input === '\\x1b\\n') {\n onInput('\\r', {\n ...key,\n return: true,\n meta: true,\n } as Key)\n return\n }\n\n // Check for special key combinations first\n if (onSpecialKey && onSpecialKey(input, key)) {\n // Special key was handled, don't process further\n return\n }\n\n // Special handling for backspace or delete\n if (\n key.backspace ||\n key.delete ||\n input === '\\b' ||\n input === '\\x7f' ||\n input === '\\x08'\n ) {\n // Ensure backspace is handled directly\n onInput(input, {\n ...key,\n backspace: true,\n })\n return\n }\n\n // Bracketed paste mode: consume sequences and emit either special paste callback or normal insertion\n if (input && handleBracketedPasteSequences(input)) {\n return\n }\n\n // Handle pastes (>800 chars)\n // Usually we get one or two input characters at a time. If we\n // get a bunch, the user has probably pasted.\n // Unfortunately node batches long pastes, so it's possible\n // that we would see e.g. 1024 characters and then just a few\n // more in the next frame that belong with the original paste.\n // This batching number is not consistent.\n if (\n onPaste &&\n shouldAggregatePasteChunk(input, pasteState.timeoutId !== null)\n ) {\n setPasteState(({ chunks, timeoutId }) => {\n return {\n chunks: [...chunks, input],\n timeoutId: resetPasteTimeout(timeoutId),\n }\n })\n return\n }\n\n onInput(input, key)\n }\n\n useInput(wrappedOnInput, { isActive: focus })\n\n let renderedPlaceholder = placeholder\n ? chalk.hex(getTheme().secondaryText)(placeholder)\n : undefined\n\n // Fake mouse cursor, because we like punishment\n if (showCursor && focus) {\n renderedPlaceholder =\n placeholder.length > 0\n ? chalk.inverse(placeholder[0]) +\n chalk.hex(getTheme().secondaryText)(placeholder.slice(1))\n : chalk.inverse(' ')\n }\n\n const showPlaceholder = originalValue.length == 0 && placeholder\n return (\n <Text wrap=\"truncate-end\" dimColor={isDimmed}>\n {showPlaceholder ? renderedPlaceholder : renderedValue}\n </Text>\n )\n}\n", "import { useState } from 'react'\nimport { type Key } from 'ink'\nimport { useDoublePress } from './useDoublePress'\nimport { Cursor } from '#cli-utils/Cursor'\nimport { normalizeLineEndings } from '#core/utils/paste'\nimport type {\n UseTextInputProps,\n UseTextInputResult,\n} from './useTextInput.types'\nimport { mapInput } from './useTextInputMapping'\nimport { tryImagePaste } from './useTextInputTryImagePaste'\n\ntype MaybeCursor = void | Cursor\n\nexport function useTextInput({\n value: originalValue,\n onChange,\n onSubmit,\n onExit,\n onExitMessage,\n onMessage,\n onHistoryUp,\n onHistoryDown,\n onHistoryReset,\n mask = '',\n multiline = false,\n cursorChar,\n invert,\n columns,\n onImagePaste,\n disableCursorMovementForUpDownKeys = false,\n externalOffset,\n onOffsetChange,\n}: UseTextInputProps): UseTextInputResult {\n const offset = externalOffset\n const setOffset = onOffsetChange\n const cursor = Cursor.fromText(originalValue, columns, offset)\n const [imagePasteErrorTimeout, setImagePasteErrorTimeout] =\n useState<NodeJS.Timeout | null>(null)\n\n function maybeClearImagePasteErrorTimeout() {\n if (!imagePasteErrorTimeout) {\n return\n }\n clearTimeout(imagePasteErrorTimeout)\n setImagePasteErrorTimeout(null)\n onMessage?.(false)\n }\n\n function applyCursor(nextCursor: Cursor) {\n if (cursor.equals(nextCursor)) {\n return\n }\n setOffset(nextCursor.offset)\n if (cursor.text !== nextCursor.text) {\n onChange(nextCursor.text)\n }\n }\n\n const handleCtrlC = useDoublePress(\n show => {\n maybeClearImagePasteErrorTimeout()\n onExitMessage?.(show, 'Ctrl-C')\n },\n () => onExit?.(),\n () => {\n if (originalValue) {\n onChange('')\n onHistoryReset?.()\n }\n },\n )\n\n // Keep Escape for clearing input\n const handleEscape = useDoublePress(\n show => {\n maybeClearImagePasteErrorTimeout()\n onMessage?.(!!originalValue && show, `Press Escape again to clear`)\n },\n () => {\n if (originalValue) {\n onChange('')\n }\n },\n )\n function clear() {\n return Cursor.fromText('', columns, 0)\n }\n\n const handleEmptyCtrlD = useDoublePress(\n show => onExitMessage?.(show, 'Ctrl-D'),\n () => onExit?.(),\n )\n\n function handleCtrlD(): MaybeCursor {\n maybeClearImagePasteErrorTimeout()\n if (cursor.text === '') {\n // When input is empty, handle double-press\n handleEmptyCtrlD()\n return cursor\n }\n // When input is not empty, delete forward like iPython\n return cursor.del()\n }\n\n function handleImagePaste() {\n return tryImagePaste({\n cursor,\n mask,\n onImagePaste,\n onMessage,\n setImagePasteErrorTimeout,\n clearImagePasteErrorTimeout: maybeClearImagePasteErrorTimeout,\n })\n }\n\n const handleCtrl = mapInput<MaybeCursor>(\n [\n ['a', () => cursor.startOfLine()],\n ['b', () => cursor.left()],\n ['c', handleCtrlC],\n ['d', handleCtrlD],\n ['e', () => cursor.endOfLine()],\n ['f', () => cursor.right()],\n [\n 'h',\n () => {\n maybeClearImagePasteErrorTimeout()\n return cursor.backspace()\n },\n ],\n ['k', () => cursor.deleteToLineEnd()],\n ['l', () => clear()],\n ['n', () => downOrHistoryDown()],\n ['p', () => upOrHistoryUp()],\n ['u', () => cursor.deleteToLineStart()],\n ['v', handleImagePaste],\n ['w', () => cursor.deleteWordBefore()],\n ],\n () => undefined,\n )\n\n const handleMeta = mapInput<MaybeCursor>(\n [\n ['b', () => cursor.prevWord()],\n ['f', () => cursor.nextWord()],\n ['d', () => cursor.deleteWordAfter()],\n ],\n () => undefined,\n )\n\n function handleEnter(key: Key) {\n if (!multiline) {\n onSubmit?.(originalValue)\n return\n }\n\n // Multiline chat input: Enter submits, Option/Alt+Enter inserts newline.\n const optionPressed = (() => {\n if (!('option' in key)) return false\n const optionValue = (key as unknown as Record<string, unknown>).option\n return optionValue === true\n })()\n if (key.meta || optionPressed) {\n return cursor.insert('\\n')\n }\n onSubmit?.(originalValue)\n }\n\n function upOrHistoryUp() {\n if (disableCursorMovementForUpDownKeys) {\n onHistoryUp?.()\n return cursor\n }\n const cursorUp = cursor.up()\n if (cursorUp.equals(cursor)) {\n // already at beginning\n onHistoryUp?.()\n }\n return cursorUp\n }\n function downOrHistoryDown() {\n if (disableCursorMovementForUpDownKeys) {\n onHistoryDown?.()\n return cursor\n }\n const cursorDown = cursor.down()\n if (cursorDown.equals(cursor)) {\n onHistoryDown?.()\n }\n return cursorDown\n }\n\n function onInput(input: string, key: Key): void {\n if (key.tab) {\n return // Skip Tab key processing - let completion system handle it\n }\n\n // Direct handling for backspace or delete (which is being detected as delete)\n if (\n key.backspace ||\n key.delete ||\n input === '\\b' ||\n input === '\\x7f' ||\n input === '\\x08'\n ) {\n applyCursor(cursor.backspace())\n return\n }\n\n // Handle paste operations - process large input strings more efficiently\n // This prevents cursor position issues when pasting into masked fields\n if (!key.ctrl && !key.meta && input.length > 1) {\n // Likely a paste operation\n applyCursor(cursor.insert(normalizeLineEndings(input)))\n return\n }\n\n const nextCursor = mapKey(key)(input)\n if (nextCursor) {\n applyCursor(nextCursor)\n }\n }\n\n function mapKey(key: Key): (input: string) => MaybeCursor {\n // Direct handling for backspace or delete\n if (key.backspace || key.delete) {\n maybeClearImagePasteErrorTimeout()\n return () => cursor.backspace()\n }\n\n switch (true) {\n case key.escape:\n return handleEscape\n case key.leftArrow && (key.ctrl || key.meta || ('fn' in key && key.fn)):\n return () => cursor.prevWord()\n case key.rightArrow && (key.ctrl || key.meta || ('fn' in key && key.fn)):\n return () => cursor.nextWord()\n case key.ctrl:\n return handleCtrl\n case 'home' in key && key.home:\n return () => cursor.startOfLine()\n case 'end' in key && key.end:\n return () => cursor.endOfLine()\n case key.pageDown:\n return () => cursor.endOfLine()\n case key.pageUp:\n return () => cursor.startOfLine()\n case key.return:\n return () => handleEnter(key)\n case key.meta:\n return handleMeta\n // Remove Tab handling - let completion system handle it\n case key.upArrow:\n return upOrHistoryUp\n case key.downArrow:\n return downOrHistoryDown\n case key.leftArrow:\n return () => cursor.left()\n case key.rightArrow:\n return () => cursor.right()\n }\n return function (input: string) {\n switch (true) {\n // Home key\n case input == '\\x1b[H' || input == '\\x1b[1~':\n return cursor.startOfLine()\n // End key\n case input == '\\x1b[F' || input == '\\x1b[4~':\n return cursor.endOfLine()\n // Handle backspace character explicitly - this is the key fix\n case input === '\\b' || input === '\\x7f' || input === '\\x08':\n maybeClearImagePasteErrorTimeout()\n return cursor.backspace()\n default:\n return cursor.insert(input.replace(/\\r/g, '\\n'))\n }\n }\n }\n\n return {\n onInput,\n renderedValue: cursor.render(cursorChar, mask, invert),\n offset,\n setOffset,\n }\n}\n", "import wrapAnsi from 'wrap-ansi'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\n\nexport type WrappedText = string[]\nexport type Position = {\n line: number\n column: number\n}\n\nclass WrappedLine {\n constructor(\n public readonly text: string,\n public readonly startOffset: number,\n public readonly isPrecededByNewline: boolean,\n public readonly endsWithNewline: boolean = false,\n ) {}\n\n equals(other: WrappedLine): boolean {\n return this.text === other.text && this.startOffset === other.startOffset\n }\n\n get length(): number {\n return this.text.length + (this.endsWithNewline ? 1 : 0)\n }\n}\n\nexport class MeasuredText {\n private wrappedLines: WrappedLine[]\n\n constructor(\n readonly text: string,\n readonly columns: number,\n ) {\n this.wrappedLines = this.measureWrappedText()\n }\n\n private measureWrappedText(): WrappedLine[] {\n const wrappedText = wrapAnsi(this.text, this.columns, {\n hard: true,\n trim: false,\n })\n\n const wrappedLines: WrappedLine[] = []\n let searchOffset = 0\n let lastNewLinePos = -1\n\n const lines = wrappedText.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const text = lines[i]!\n const isPrecededByNewline = (startOffset: number) =>\n i == 0 || (startOffset > 0 && this.text[startOffset - 1] === '\\n')\n\n if (text.length === 0) {\n // For blank lines, find the next newline character after the last one\n lastNewLinePos = this.text.indexOf('\\n', lastNewLinePos + 1)\n\n if (lastNewLinePos !== -1) {\n const startOffset = lastNewLinePos\n const endsWithNewline = true\n\n wrappedLines.push(\n new WrappedLine(\n text,\n startOffset,\n isPrecededByNewline(startOffset),\n endsWithNewline,\n ),\n )\n } else {\n // If we can't find another newline, this must be the end of text\n const startOffset = this.text.length\n wrappedLines.push(\n new WrappedLine(\n text,\n startOffset,\n isPrecededByNewline(startOffset),\n false,\n ),\n )\n }\n } else {\n // For non-blank lines\n const startOffset = this.text.indexOf(text, searchOffset)\n if (startOffset === -1) {\n debugLogger.error('CURSOR_WRAP_MISMATCH', {\n currentText: text,\n originalText: this.text,\n searchOffset,\n wrappedText,\n })\n throw new Error('Failed to find wrapped line in original text')\n }\n\n searchOffset = startOffset + text.length\n\n // Check if this line ends with a newline in the original text\n const potentialNewlinePos = startOffset + text.length\n const endsWithNewline =\n potentialNewlinePos < this.text.length &&\n this.text[potentialNewlinePos] === '\\n'\n\n if (endsWithNewline) {\n lastNewLinePos = potentialNewlinePos\n }\n\n wrappedLines.push(\n new WrappedLine(\n text,\n startOffset,\n isPrecededByNewline(startOffset),\n endsWithNewline,\n ),\n )\n }\n }\n\n return wrappedLines\n }\n\n public getWrappedText(): WrappedText {\n return this.wrappedLines.map(line =>\n line.isPrecededByNewline ? line.text : line.text.trimStart(),\n )\n }\n\n private getLine(line: number): WrappedLine {\n return this.wrappedLines[\n Math.max(0, Math.min(line, this.wrappedLines.length - 1))\n ]!\n }\n\n public getOffsetFromPosition(position: Position): number {\n const wrappedLine = this.getLine(position.line)\n const startOffsetPlusColumn = wrappedLine.startOffset + position.column\n\n // Handle blank lines specially\n if (wrappedLine.text.length === 0 && wrappedLine.endsWithNewline) {\n return wrappedLine.startOffset\n }\n\n // For normal lines\n const lineEnd = wrappedLine.startOffset + wrappedLine.text.length\n // Add 1 only if this line ends with a newline\n const maxOffset = wrappedLine.endsWithNewline ? lineEnd + 1 : lineEnd\n\n return Math.min(startOffsetPlusColumn, maxOffset)\n }\n\n public getLineLength(line: number): number {\n const currentLine = this.getLine(line)\n const nextLine = this.getLine(line + 1)\n if (nextLine.equals(currentLine)) {\n return this.text.length - currentLine.startOffset\n }\n\n return nextLine.startOffset - currentLine.startOffset - 1\n }\n\n public getPositionFromOffset(offset: number): Position {\n const lines = this.wrappedLines\n for (let line = 0; line < lines.length; line++) {\n const currentLine = lines[line]!\n const nextLine = lines[line + 1]\n if (\n offset >= currentLine.startOffset &&\n (!nextLine || offset < nextLine.startOffset)\n ) {\n const leadingWhitepace = currentLine.isPrecededByNewline\n ? 0\n : currentLine.text.length - currentLine.text.trimStart().length\n const column = Math.max(\n 0,\n Math.min(\n offset - currentLine.startOffset - leadingWhitepace,\n currentLine.text.length,\n ),\n )\n return {\n line,\n column,\n }\n }\n }\n\n // If we're past the last character, return the end of the last line\n const line = lines.length - 1\n return {\n line,\n column: this.wrappedLines[line]!.text.length,\n }\n }\n\n public get lineCount(): number {\n return this.wrappedLines.length\n }\n\n equals(other: MeasuredText): boolean {\n return this.text === other.text && this.columns === other.columns\n }\n}\n", "import type { Position } from './Cursor/MeasuredText'\nimport { MeasuredText } from './Cursor/MeasuredText'\n\nexport class Cursor {\n readonly offset: number\n\n constructor(\n readonly measuredText: MeasuredText,\n offset: number = 0,\n readonly selection: number = 0,\n ) {\n // it's ok for the cursor to be 1 char beyond the end of the string\n this.offset = Math.max(0, Math.min(this.measuredText.text.length, offset))\n }\n\n static fromText(\n text: string,\n columns: number,\n offset: number = 0,\n selection: number = 0,\n ): Cursor {\n // make MeasuredText on less than columns width, to account for cursor\n return new Cursor(new MeasuredText(text, columns - 1), offset, selection)\n }\n\n render(cursorChar: string, mask: string, invert: (text: string) => string) {\n const { line, column } = this.getPosition()\n return this.measuredText\n .getWrappedText()\n .map((text, currentLine, allLines) => {\n let displayText = text\n if (mask && currentLine === allLines.length - 1) {\n const lastSixStart = Math.max(0, text.length - 6)\n displayText = mask.repeat(lastSixStart) + text.slice(lastSixStart)\n }\n // looking for the line with the cursor\n if (line != currentLine) return displayText.trimEnd()\n\n return (\n displayText.slice(0, column) +\n invert(displayText[column] || cursorChar) +\n displayText.trimEnd().slice(column + 1)\n )\n })\n .join('\\n')\n }\n\n left(): Cursor {\n return new Cursor(this.measuredText, this.offset - 1)\n }\n\n right(): Cursor {\n return new Cursor(this.measuredText, this.offset + 1)\n }\n\n up(): Cursor {\n const { line, column } = this.getPosition()\n if (line == 0) {\n return new Cursor(this.measuredText, 0, 0)\n }\n\n const newOffset = this.getOffset({ line: line - 1, column })\n return new Cursor(this.measuredText, newOffset, 0)\n }\n\n down(): Cursor {\n const { line, column } = this.getPosition()\n if (line >= this.measuredText.lineCount - 1) {\n return new Cursor(this.measuredText, this.text.length, 0)\n }\n\n const newOffset = this.getOffset({ line: line + 1, column })\n return new Cursor(this.measuredText, newOffset, 0)\n }\n\n startOfLine(): Cursor {\n const { line } = this.getPosition()\n return new Cursor(\n this.measuredText,\n this.getOffset({\n line,\n column: 0,\n }),\n 0,\n )\n }\n\n endOfLine(): Cursor {\n const { line } = this.getPosition()\n const column = this.measuredText.getLineLength(line)\n const offset = this.getOffset({ line, column })\n return new Cursor(this.measuredText, offset, 0)\n }\n\n nextWord(): Cursor {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let nextCursor: Cursor = this\n // If we're on a word, move to the next non-word\n while (nextCursor.isOverWordChar() && !nextCursor.isAtEnd()) {\n nextCursor = nextCursor.right()\n }\n // now move to the next word char\n while (!nextCursor.isOverWordChar() && !nextCursor.isAtEnd()) {\n nextCursor = nextCursor.right()\n }\n return nextCursor\n }\n\n prevWord(): Cursor {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let cursor: Cursor = this\n\n // if we are already at the beginning of a word, step off it\n if (!cursor.left().isOverWordChar()) {\n cursor = cursor.left()\n }\n\n // Move left over any non-word characters\n while (!cursor.isOverWordChar() && !cursor.isAtStart()) {\n cursor = cursor.left()\n }\n\n // If we're over a word character, move to the start of this word\n if (cursor.isOverWordChar()) {\n while (cursor.left().isOverWordChar() && !cursor.isAtStart()) {\n cursor = cursor.left()\n }\n }\n\n return cursor\n }\n\n private modifyText(end: Cursor, insertString: string = ''): Cursor {\n const startOffset = this.offset\n const endOffset = end.offset\n\n const newText =\n this.text.slice(0, startOffset) +\n insertString +\n this.text.slice(endOffset)\n\n return Cursor.fromText(\n newText,\n this.columns,\n startOffset + insertString.length,\n )\n }\n\n insert(insertString: string): Cursor {\n const newCursor = this.modifyText(this, insertString)\n return newCursor\n }\n\n del(): Cursor {\n if (this.isAtEnd()) {\n return this\n }\n return this.modifyText(this.right())\n }\n\n backspace(): Cursor {\n if (this.isAtStart()) {\n return this\n }\n\n // Get the current position\n const currentOffset = this.offset\n\n // Create a new cursor at the position before the current one\n const leftCursor = this.left()\n const leftOffset = leftCursor.offset\n\n // Create the new text by removing one character\n const newText =\n this.text.slice(0, leftOffset) + this.text.slice(currentOffset)\n\n // Return a new cursor with the updated text and position\n return Cursor.fromText(newText, this.columns, leftOffset)\n }\n\n deleteToLineStart(): Cursor {\n return this.startOfLine().modifyText(this)\n }\n\n deleteToLineEnd(): Cursor {\n // If cursor is on a newline character, delete just that character\n if (this.text[this.offset] === '\\n') {\n return this.modifyText(this.right())\n }\n\n return this.modifyText(this.endOfLine())\n }\n\n deleteWordBefore(): Cursor {\n if (this.isAtStart()) {\n return this\n }\n return this.prevWord().modifyText(this)\n }\n\n deleteWordAfter(): Cursor {\n if (this.isAtEnd()) {\n return this\n }\n\n return this.modifyText(this.nextWord())\n }\n\n private isOverWordChar(): boolean {\n const currentChar = this.text[this.offset] ?? ''\n return /\\w/.test(currentChar)\n }\n\n equals(other: Cursor): boolean {\n return (\n this.offset === other.offset && this.measuredText == other.measuredText\n )\n }\n\n private isAtStart(): boolean {\n return this.offset == 0\n }\n\n private isAtEnd(): boolean {\n return this.offset == this.text.length\n }\n\n public get text(): string {\n return this.measuredText.text\n }\n\n private get columns(): number {\n return this.measuredText.columns + 1\n }\n\n private getPosition(): Position {\n return this.measuredText.getPositionFromOffset(this.offset)\n }\n\n private getOffset(position: Position): number {\n return this.measuredText.getOffsetFromPosition(position)\n }\n}\n\nexport { MeasuredText } from './Cursor/MeasuredText'\n", "export function mapInput<T>(\n inputMap: Array<[string, (input: string) => T]>,\n defaultHandler: (input: string) => T,\n): (input: string) => T {\n const handlers = new Map(inputMap)\n return (input: string) => (handlers.get(input) ?? defaultHandler)(input)\n}\n", "import { execSync } from 'child_process'\nimport { readFileSync } from 'fs'\n\nconst SCREENSHOT_PATH = '/tmp/kode_cli_latest_screenshot.png'\n\nexport const CLIPBOARD_ERROR_MESSAGE =\n 'No image found in clipboard. Use Cmd + Ctrl + Shift + 4 to copy a screenshot to clipboard.'\n\nexport function getImageFromClipboard(): string | null {\n if (process.platform !== 'darwin') {\n // only support image paste on macOS for now\n return null\n }\n\n try {\n // Check if clipboard has image\n execSync(`osascript -e 'the clipboard as \u00ABclass PNGf\u00BB'`, {\n stdio: 'ignore',\n })\n\n // Save the image\n execSync(\n `osascript -e 'set png_data to (the clipboard as \u00ABclass PNGf\u00BB)' -e 'set fp to open for access POSIX file \"${SCREENSHOT_PATH}\" with write permission' -e 'write png_data to fp' -e 'close access fp'`,\n { stdio: 'ignore' },\n )\n\n // Read the image and convert to base64\n const imageBuffer = readFileSync(SCREENSHOT_PATH)\n const base64Image = imageBuffer.toString('base64')\n\n // Cleanup\n execSync(`rm -f \"${SCREENSHOT_PATH}\"`, { stdio: 'ignore' })\n\n return base64Image\n } catch {\n return null\n }\n}\n", "import type { Cursor } from '#cli-utils/Cursor'\nimport {\n CLIPBOARD_ERROR_MESSAGE,\n getImageFromClipboard,\n} from '#core/utils/imagePaste'\n\nconst IMAGE_PLACEHOLDER = '[Image pasted]'\n\nexport function tryImagePaste({\n cursor,\n mask,\n onImagePaste,\n onMessage,\n setImagePasteErrorTimeout,\n clearImagePasteErrorTimeout,\n}: {\n cursor: Cursor\n mask: string\n onImagePaste?: (base64Image: string) => string | void\n onMessage?: (show: boolean, message?: string) => void\n setImagePasteErrorTimeout: (timeout: NodeJS.Timeout | null) => void\n clearImagePasteErrorTimeout: () => void\n}): Cursor {\n if (mask) {\n return cursor\n }\n\n const base64Image = getImageFromClipboard()\n if (base64Image === null) {\n if (process.platform !== 'darwin') {\n return cursor\n }\n onMessage?.(true, CLIPBOARD_ERROR_MESSAGE)\n clearImagePasteErrorTimeout()\n setImagePasteErrorTimeout(\n setTimeout(() => {\n onMessage?.(false)\n }, 4000),\n )\n return cursor\n }\n\n const placeholder = onImagePaste?.(base64Image)\n return cursor.insert(\n typeof placeholder === 'string' ? placeholder : IMAGE_PLACEHOLDER,\n )\n}\n", "import React from 'react'\nimport {\n normalizeLineEndings,\n shouldTreatAsSpecialPaste,\n} from '#core/utils/paste'\n\nconst BRACKETED_PASTE_ENABLE = '\\x1b[?2004h'\nconst BRACKETED_PASTE_DISABLE = '\\x1b[?2004l'\nconst BRACKETED_PASTE_START = '\\x1b[200~'\nconst BRACKETED_PASTE_END = '\\x1b[201~'\n// Some input decoders (including Ink in certain terminals) may strip the leading ESC and\n// deliver the CSI sequences as \"[200~\" / \"[201~\". Accept both forms to avoid leaking markers into input.\nconst BRACKETED_PASTE_START_NO_ESC = '[200~'\nconst BRACKETED_PASTE_END_NO_ESC = '[201~'\n\nlet bracketedPasteRefCount = 0\n\nfunction setBracketedPasteEnabled(enabled: boolean) {\n if (!process.stdout?.isTTY) return\n process.stdout.write(\n enabled ? BRACKETED_PASTE_ENABLE : BRACKETED_PASTE_DISABLE,\n )\n}\n\nfunction acquireBracketedPasteMode() {\n if (bracketedPasteRefCount === 0) {\n setBracketedPasteEnabled(true)\n }\n bracketedPasteRefCount++\n}\n\nfunction releaseBracketedPasteMode() {\n bracketedPasteRefCount = Math.max(0, bracketedPasteRefCount - 1)\n if (bracketedPasteRefCount === 0) {\n setBracketedPasteEnabled(false)\n }\n}\n\nexport function useBracketedPasteMode(): void {\n React.useEffect(() => {\n acquireBracketedPasteMode()\n return () => releaseBracketedPasteMode()\n }, [])\n}\n\ntype BracketedPasteState = {\n mode: 'normal' | 'in_paste'\n incomplete: string\n buffer: string\n}\n\nfunction longestSuffixPrefix(haystack: string, needle: string): number {\n const max = Math.min(haystack.length, needle.length - 1)\n for (let len = max; len > 0; len--) {\n if (haystack.endsWith(needle.slice(0, len))) return len\n }\n return 0\n}\n\nfunction findFirstMarker(\n haystack: string,\n markers: string[],\n): { index: number; marker: string } | null {\n let best: { index: number; marker: string } | null = null\n for (const marker of markers) {\n const index = haystack.indexOf(marker)\n if (index === -1) continue\n if (!best || index < best.index) {\n best = { index, marker }\n }\n }\n return best\n}\n\nfunction getSuffixKeepLength(haystack: string, markers: string[]): number {\n let keep = 0\n for (const marker of markers) {\n keep = Math.max(keep, longestSuffixPrefix(haystack, marker))\n }\n return keep\n}\n\nexport type BracketedPasteHandlerOptions = {\n insertText: (text: string) => void\n onPaste?: (text: string) => void\n}\n\nexport function useBracketedPasteSequences({\n insertText,\n onPaste,\n}: BracketedPasteHandlerOptions): (input: string) => boolean {\n const stateRef = React.useRef<BracketedPasteState>({\n mode: 'normal',\n incomplete: '',\n buffer: '',\n })\n\n const flushBracketedPasteBuffer = React.useCallback(\n (rawText: string) => {\n const normalized = normalizeLineEndings(rawText)\n if (onPaste && shouldTreatAsSpecialPaste(normalized)) {\n // Schedule callback after current render to avoid state updates during render\n Promise.resolve().then(() => onPaste(normalized))\n return\n }\n\n // Normal paste: insert directly into input.\n insertText(normalized)\n },\n [insertText, onPaste],\n )\n\n return React.useCallback(\n (input: string): boolean => {\n const state = stateRef.current\n let handledAny = false\n let data = state.incomplete + input\n state.incomplete = ''\n\n const startMarkers = [BRACKETED_PASTE_START, BRACKETED_PASTE_START_NO_ESC]\n const endMarkers = [BRACKETED_PASTE_END, BRACKETED_PASTE_END_NO_ESC]\n\n while (data) {\n if (state.mode === 'normal') {\n const start = findFirstMarker(data, startMarkers)\n if (!start) {\n const keep = getSuffixKeepLength(data, startMarkers)\n if (keep === 0) {\n if (!handledAny) {\n return false\n }\n insertText(data)\n return true\n }\n\n const toInsert = data.slice(0, -keep)\n if (toInsert) {\n insertText(toInsert)\n }\n state.incomplete = data.slice(-keep)\n handledAny = true\n return true\n }\n\n const before = data.slice(0, start.index)\n if (before) {\n insertText(before)\n }\n\n data = data.slice(start.index + start.marker.length)\n state.mode = 'in_paste'\n handledAny = true\n continue\n }\n\n const end = findFirstMarker(data, endMarkers)\n if (!end) {\n const keep = getSuffixKeepLength(data, endMarkers)\n const content = keep > 0 ? data.slice(0, -keep) : data\n if (content) {\n state.buffer += content\n }\n if (keep > 0) {\n state.incomplete = data.slice(-keep)\n }\n handledAny = true\n return true\n }\n\n state.buffer += data.slice(0, end.index)\n const completedPaste = state.buffer\n state.buffer = ''\n state.mode = 'normal'\n\n flushBracketedPasteBuffer(completedPaste)\n\n data = data.slice(end.index + end.marker.length)\n handledAny = true\n continue\n }\n\n return true\n },\n [flushBracketedPasteBuffer, insertText],\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport { providers } from '#core/constants/models'\nimport TextInput from '#ui-ink/components/TextInput'\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n selectedProvider: string\n isLoadingModels: boolean\n modelLoadError: string | null\n // custom-openai\n customBaseUrl: string\n setCustomBaseUrl: (value: string) => void\n handleCustomBaseUrlSubmit: (value: string) => void\n customBaseUrlCursorOffset: number\n setCustomBaseUrlCursorOffset: (value: number) => void\n // general provider base URL\n providerBaseUrl: string\n setProviderBaseUrl: (value: string) => void\n handleProviderBaseUrlSubmit: (value: string) => void\n providerBaseUrlCursorOffset: number\n setProviderBaseUrlCursorOffset: (value: number) => void\n}\n\nexport function BaseUrlScreen({\n theme,\n exitState,\n selectedProvider,\n isLoadingModels,\n modelLoadError,\n customBaseUrl,\n setCustomBaseUrl,\n handleCustomBaseUrlSubmit,\n customBaseUrlCursorOffset,\n setCustomBaseUrlCursorOffset,\n providerBaseUrl,\n setProviderBaseUrl,\n handleProviderBaseUrlSubmit,\n providerBaseUrlCursorOffset,\n setProviderBaseUrlCursorOffset,\n}: Props) {\n const isCustomOpenAI = selectedProvider === 'custom-openai'\n\n // For custom-openai, we still use the old logic with customBaseUrl\n if (isCustomOpenAI) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Custom API Server Setup{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Enter your custom API URL:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This is the base URL for your OpenAI-compatible API.\n <Newline />\n For example: https://api.example.com/v1\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder=\"https://api.example.com/v1\"\n value={customBaseUrl}\n onChange={setCustomBaseUrl}\n onSubmit={handleCustomBaseUrlSubmit}\n columns={100}\n cursorOffset={customBaseUrlCursorOffset}\n onChangeCursorOffset={setCustomBaseUrlCursorOffset}\n showCursor={!isLoadingModels}\n focus={!isLoadingModels}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text>\n <Text\n color={\n isLoadingModels ? theme.secondaryText : theme.suggestion\n }\n >\n [Submit Base URL]\n </Text>\n <Text> - Press Enter or click to continue</Text>\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // For all other providers, use the new general provider URL configuration\n const providerName = providers[selectedProvider]?.name || selectedProvider\n const defaultUrl = providers[selectedProvider]?.baseURL || ''\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n {providerName} API Configuration{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Configure the API endpoint for {providerName}:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n {selectedProvider === 'ollama' ? (\n <>\n This is the URL of your Ollama server.\n <Newline />\n Default is http://localhost:11434/v1 for local Ollama\n installations.\n </>\n ) : (\n <>\n This is the base URL for the {providerName} API.\n <Newline />\n You can modify this URL or press Enter to use the default.\n </>\n )}\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder={defaultUrl}\n value={providerBaseUrl}\n onChange={setProviderBaseUrl}\n onSubmit={handleProviderBaseUrlSubmit}\n columns={100}\n cursorOffset={providerBaseUrlCursorOffset}\n onChangeCursorOffset={setProviderBaseUrlCursorOffset}\n showCursor={!isLoadingModels}\n focus={!isLoadingModels}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text>\n <Text\n color={isLoadingModels ? theme.secondaryText : theme.suggestion}\n >\n [Submit Base URL]\n </Text>\n <Text> - Press Enter or click to continue</Text>\n </Text>\n </Box>\n\n {isLoadingModels && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n {selectedProvider === 'ollama'\n ? 'Connecting to Ollama server...'\n : `Connecting to ${providerName}...`}\n </Text>\n </Box>\n )}\n\n {modelLoadError && (\n <Box marginTop={1}>\n <Text color=\"red\">Error: {modelLoadError}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\nimport { CONTEXT_LENGTH_OPTIONS } from '../options'\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n selectedProvider: string\n selectedModel: string\n resourceName: string\n ollamaBaseUrl: string\n customBaseUrl: string\n apiKey: string\n maxTokens: string\n contextLength: number\n supportsReasoningEffort: boolean\n reasoningEffort: any\n validationError: string | null\n formatApiKeyDisplay: (key: string) => string\n getProviderLabel: (provider: string, modelCount: number) => string\n}\n\nexport function ConfirmationScreen({\n theme,\n exitState,\n selectedProvider,\n selectedModel,\n resourceName,\n ollamaBaseUrl,\n customBaseUrl,\n apiKey,\n maxTokens,\n contextLength,\n supportsReasoningEffort,\n reasoningEffort,\n validationError,\n formatApiKeyDisplay,\n getProviderLabel,\n}: Props) {\n // Show model profile being created\n\n // Get provider display name\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\n ' (',\n )[0]\n\n // Determine if provider requires API key\n const showsApiKey = selectedProvider !== 'ollama'\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Configuration Confirmation{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Confirm your model configuration:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n Please review your selections before saving.\n </Text>\n </Box>\n\n {validationError && (\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\n <Text color={theme.error} bold>\n \u26A0 Configuration Error:\n </Text>\n <Text color={theme.error}>{validationError}</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\n <Text>\n <Text bold>Provider: </Text>\n <Text color={theme.suggestion}>{providerDisplayName}</Text>\n </Text>\n\n {selectedProvider === 'azure' && (\n <Text>\n <Text bold>Resource Name: </Text>\n <Text color={theme.suggestion}>{resourceName}</Text>\n </Text>\n )}\n\n {selectedProvider === 'ollama' && (\n <Text>\n <Text bold>Server URL: </Text>\n <Text color={theme.suggestion}>{ollamaBaseUrl}</Text>\n </Text>\n )}\n\n {selectedProvider === 'custom-openai' && (\n <Text>\n <Text bold>API Base URL: </Text>\n <Text color={theme.suggestion}>{customBaseUrl}</Text>\n </Text>\n )}\n\n <Text>\n <Text bold>Model: </Text>\n <Text color={theme.suggestion}>{selectedModel}</Text>\n </Text>\n\n {apiKey && showsApiKey && (\n <Text>\n <Text bold>API Key: </Text>\n <Text color={theme.suggestion}>\n {formatApiKeyDisplay(apiKey)}\n </Text>\n </Text>\n )}\n\n {maxTokens && (\n <Text>\n <Text bold>Max Tokens: </Text>\n <Text color={theme.suggestion}>{maxTokens}</Text>\n </Text>\n )}\n\n <Text>\n <Text bold>Context Length: </Text>\n <Text color={theme.suggestion}>\n {CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength)\n ?.label || `${contextLength.toLocaleString()} tokens`}\n </Text>\n </Text>\n\n {supportsReasoningEffort && (\n <Text>\n <Text bold>Reasoning Effort: </Text>\n <Text color={theme.suggestion}>{reasoningEffort}</Text>\n </Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\n model parameters or <Text color={theme.suggestion}>Enter</Text> to\n save configuration\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "export type ReasoningEffortOption = 'low' | 'medium' | 'high'\n\nexport const REASONING_EFFORT_OPTIONS: Array<{\n label: string\n value: ReasoningEffortOption\n}> = [\n { label: 'Low - Faster responses, less thorough reasoning', value: 'low' },\n { label: 'Medium - Balanced speed and reasoning depth', value: 'medium' },\n {\n label: 'High - Slower responses, more thorough reasoning',\n value: 'high',\n },\n]\n\nexport type ContextLengthOption = {\n label: string\n value: number\n}\n\nexport const CONTEXT_LENGTH_OPTIONS: ContextLengthOption[] = [\n { label: '32K tokens', value: 32000 },\n { label: '64K tokens', value: 64000 },\n { label: '128K tokens', value: 128000 },\n { label: '200K tokens', value: 200000 },\n { label: '256K tokens', value: 256000 },\n { label: '300K tokens', value: 300000 },\n { label: '512K tokens', value: 512000 },\n { label: '1000K tokens', value: 1000000 },\n { label: '2000K tokens', value: 2000000 },\n { label: '3000K tokens', value: 3000000 },\n { label: '5000K tokens', value: 5000000 },\n { label: '10000K tokens', value: 10000000 },\n]\n\nexport const DEFAULT_CONTEXT_LENGTH = 128000\n\nexport type MaxTokensOption = {\n label: string\n value: number\n}\n\nexport const MAX_TOKENS_OPTIONS: MaxTokensOption[] = [\n { label: '1K tokens', value: 1024 },\n { label: '2K tokens', value: 2048 },\n { label: '4K tokens', value: 4096 },\n { label: '8K tokens (recommended)', value: 8192 },\n { label: '16K tokens', value: 16384 },\n { label: '32K tokens', value: 32768 },\n { label: '64K tokens', value: 65536 },\n { label: '128K tokens', value: 131072 },\n]\n\nexport const DEFAULT_MAX_TOKENS = 8192\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n selectedProvider: string\n getProviderLabel: (provider: string, modelCount: number) => string\n isTestingConnection: boolean\n connectionTestResult: {\n success: boolean\n message: string\n endpoint?: string\n details?: string\n } | null\n}\n\nexport function ConnectionTestScreen({\n theme,\n exitState,\n selectedProvider,\n getProviderLabel,\n isTestingConnection,\n connectionTestResult,\n}: Props) {\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\n ' (',\n )[0]\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Connection Test{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Testing connection to {providerDisplayName}...</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This will verify your configuration by sending a test request to\n the API.\n {selectedProvider === 'minimax' && (\n <>\n <Newline />\n For MiniMax, we'll test both v2 and v1 endpoints to find the\n best one.\n </>\n )}\n </Text>\n </Box>\n\n {!connectionTestResult && !isTestingConnection && (\n <Box marginY={1}>\n <Text>\n <Text color={theme.suggestion}>Press Enter</Text> to start the\n connection test\n </Text>\n </Box>\n )}\n\n {isTestingConnection && (\n <Box marginY={1}>\n <Text color={theme.suggestion}>\uD83D\uDD04 Testing connection...</Text>\n </Box>\n )}\n\n {connectionTestResult && (\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\n <Text\n color={connectionTestResult.success ? theme.success : 'red'}\n >\n {connectionTestResult.message}\n </Text>\n\n {connectionTestResult.endpoint && (\n <Text color={theme.secondaryText}>\n Endpoint: {connectionTestResult.endpoint}\n </Text>\n )}\n\n {connectionTestResult.details && (\n <Text color={theme.secondaryText}>\n Details: {connectionTestResult.details}\n </Text>\n )}\n\n {connectionTestResult.success ? (\n <Box marginTop={1}>\n <Text color={theme.success}>\n \u2705 Automatically proceeding to confirmation...\n </Text>\n </Box>\n ) : (\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion}>Press Enter</Text> to retry\n test, or <Text color={theme.suggestion}>Esc</Text> to go\n back\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\n context length\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\nimport { CONTEXT_LENGTH_OPTIONS, DEFAULT_CONTEXT_LENGTH } from '../options'\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n contextLength: number\n}\n\nexport function ContextLengthScreen({\n theme,\n exitState,\n contextLength,\n}: Props) {\n const selectedOption =\n CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength) ||\n CONTEXT_LENGTH_OPTIONS[2] // Default to 128K\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Context Length Configuration{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Choose the context window length for your model:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This determines how much conversation history and context the\n model can process at once. Higher values allow for longer\n conversations but may increase costs.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n {CONTEXT_LENGTH_OPTIONS.map((option, index) => {\n const isSelected = option.value === contextLength\n return (\n <Box key={option.value} flexDirection=\"row\">\n <Text color={isSelected ? 'blue' : undefined}>\n {isSelected ? '\u2192 ' : ' '}\n {option.label}\n {option.value === DEFAULT_CONTEXT_LENGTH\n ? ' (recommended)'\n : ''}\n </Text>\n </Box>\n )\n })}\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n <Text dimColor>\n Selected:{' '}\n <Text color={theme.suggestion}>{selectedOption.label}</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n\n <Box marginLeft={1}>\n <Text dimColor>\u2191/\u2193 to select \u00B7 Enter to continue \u00B7 Esc to go back</Text>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport TextInput from '#ui-ink/components/TextInput'\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n selectedProvider: string\n customModelName: string\n setCustomModelName: (value: string) => void\n handleCustomModelSubmit: (value: string) => void\n customModelNameCursorOffset: number\n setCustomModelNameCursorOffset: (value: number) => void\n}\n\nexport function ModelInputScreen({\n theme,\n exitState,\n selectedProvider,\n customModelName,\n setCustomModelName,\n handleCustomModelSubmit,\n customModelNameCursorOffset,\n setCustomModelNameCursorOffset,\n}: Props) {\n const modelTypeText = 'this model profile'\n\n // Determine the screen title and description based on provider\n let screenTitle = 'Manual Model Setup'\n let description = 'Enter the model name manually'\n let placeholder = 'gpt-4'\n let examples = 'For example: \"gpt-4\", \"gpt-3.5-turbo\", etc.'\n\n if (selectedProvider === 'azure') {\n screenTitle = 'Azure Model Setup'\n description = `Enter your Azure OpenAI deployment name for ${modelTypeText}:`\n examples = 'For example: \"gpt-4\", \"gpt-35-turbo\", etc.'\n placeholder = 'gpt-4'\n } else if (selectedProvider === 'anthropic') {\n screenTitle = 'Model Setup'\n description = `Enter the model name for ${modelTypeText}:`\n examples =\n 'For example: \"claude-3-5-sonnet-latest\", \"claude-3-5-haiku-latest\", etc.'\n placeholder = 'claude-3-5-sonnet-latest'\n } else if (selectedProvider === 'bigdream') {\n screenTitle = 'BigDream Model Setup'\n description = `Enter the BigDream model name for ${modelTypeText}:`\n examples =\n 'For example: \"claude-3-5-sonnet-latest\", \"claude-3-5-haiku-latest\", etc.'\n placeholder = 'claude-3-5-sonnet-latest'\n } else if (selectedProvider === 'kimi') {\n screenTitle = 'Kimi Model Setup'\n description = `Enter the Kimi model name for ${modelTypeText}:`\n examples = 'For example: \"kimi-k2-0711-preview\"'\n placeholder = 'kimi-k2-0711-preview'\n } else if (selectedProvider === 'deepseek') {\n screenTitle = 'DeepSeek Model Setup'\n description = `Enter the DeepSeek model name for ${modelTypeText}:`\n examples =\n 'For example: \"deepseek-chat\", \"deepseek-coder\", \"deepseek-reasoner\", etc.'\n placeholder = 'deepseek-chat'\n } else if (selectedProvider === 'siliconflow') {\n screenTitle = 'SiliconFlow Model Setup'\n description = `Enter the SiliconFlow model name for ${modelTypeText}:`\n examples =\n 'For example: \"Qwen/Qwen2.5-72B-Instruct\", \"meta-llama/Meta-Llama-3.1-8B-Instruct\", etc.'\n placeholder = 'Qwen/Qwen2.5-72B-Instruct'\n } else if (selectedProvider === 'qwen') {\n screenTitle = 'Qwen Model Setup'\n description = `Enter the Qwen model name for ${modelTypeText}:`\n examples = 'For example: \"qwen-plus\", \"qwen-turbo\", \"qwen-max\", etc.'\n placeholder = 'qwen-plus'\n } else if (selectedProvider === 'glm') {\n screenTitle = 'GLM Model Setup'\n description = `Enter the GLM model name for ${modelTypeText}:`\n examples = 'For example: \"glm-4\", \"glm-4v\", \"glm-3-turbo\", etc.'\n placeholder = 'glm-4'\n } else if (selectedProvider === 'glm-coding') {\n screenTitle = 'GLM Coding Plan Model Setup'\n description = `Enter the GLM model name for ${modelTypeText}:`\n examples = 'For Coding Plan, typically use: \"GLM-4.6\" or other GLM models'\n placeholder = 'GLM-4.6'\n } else if (selectedProvider === 'minimax') {\n screenTitle = 'MiniMax Model Setup'\n description = `Enter the MiniMax model name for ${modelTypeText}:`\n examples =\n 'For example: \"abab6.5s-chat\", \"abab6.5g-chat\", \"abab5.5s-chat\", etc.'\n placeholder = 'abab6.5s-chat'\n } else if (selectedProvider === 'minimax-coding') {\n screenTitle = 'MiniMax Coding Plan Model Setup'\n description = `Enter the MiniMax model name for ${modelTypeText}:`\n examples = 'For Coding Plan, use: \"MiniMax-M2\"'\n placeholder = 'MiniMax-M2'\n } else if (selectedProvider === 'baidu-qianfan') {\n screenTitle = 'Baidu Qianfan Model Setup'\n description = `Enter the Baidu Qianfan model name for ${modelTypeText}:`\n examples =\n 'For example: \"ERNIE-4.0-8K\", \"ERNIE-3.5-8K\", \"ERNIE-Speed-128K\", etc.'\n placeholder = 'ERNIE-4.0-8K'\n } else if (selectedProvider === 'custom-openai') {\n screenTitle = 'Custom API Model Setup'\n description = `Enter the model name for ${modelTypeText}:`\n examples = 'Enter the exact model name as supported by your API endpoint.'\n placeholder = 'model-name'\n }\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n {screenTitle}{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>{description}</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n {selectedProvider === 'azure'\n ? 'This is the deployment name you configured in your Azure OpenAI resource.'\n : selectedProvider === 'anthropic'\n ? 'This should match a model identifier supported by your API endpoint.'\n : selectedProvider === 'bigdream'\n ? 'This should be a valid model identifier supported by BigDream.'\n : selectedProvider === 'kimi'\n ? 'This should be a valid Kimi model identifier from Moonshot AI.'\n : selectedProvider === 'deepseek'\n ? 'This should be a valid DeepSeek model identifier.'\n : selectedProvider === 'siliconflow'\n ? 'This should be a valid SiliconFlow model identifier.'\n : selectedProvider === 'qwen'\n ? 'This should be a valid Qwen model identifier from Alibaba Cloud.'\n : selectedProvider === 'glm'\n ? 'This should be a valid GLM model identifier from Zhipu AI.'\n : selectedProvider === 'minimax'\n ? 'This should be a valid MiniMax model identifier.'\n : selectedProvider === 'baidu-qianfan'\n ? 'This should be a valid Baidu Qianfan model identifier.'\n : 'This should match the model name supported by your API endpoint.'}\n <Newline />\n {examples}\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder={placeholder}\n value={customModelName}\n onChange={setCustomModelName}\n onSubmit={handleCustomModelSubmit}\n columns={100}\n cursorOffset={customModelNameCursorOffset}\n onChangeCursorOffset={setCustomModelNameCursorOffset}\n showCursor={true}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion} dimColor={!customModelName}>\n [Submit Model Name]\n </Text>\n <Text> - Press Enter or click to continue</Text>\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\nimport { Select } from '#ui-ink/components/CustomSelect/select'\n\nimport { type ReasoningEffortOption, MAX_TOKENS_OPTIONS } from '../options'\n\nfunction isReasoningEffortOption(\n value: string,\n): value is ReasoningEffortOption {\n return value === 'low' || value === 'medium' || value === 'high'\n}\n\ntype Field = {\n name: string\n label: string\n description?: string\n component: 'select' | 'button'\n options?: Array<{ label: string; value: string }>\n defaultValue?: string\n}\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n selectedModel: string\n formFields: Field[]\n activeFieldIndex: number\n setActiveFieldIndex: (value: number | ((current: number) => number)) => void\n maxTokens: string\n setMaxTokens: (value: string) => void\n setSelectedMaxTokensPreset: (value: number) => void\n setMaxTokensCursorOffset: (value: number) => void\n reasoningEffortOptions: Array<{ label: string; value: ReasoningEffortOption }>\n reasoningEffort: ReasoningEffortOption | null\n setReasoningEffort: (value: ReasoningEffortOption | null) => void\n}\n\nexport function ModelParamsScreen({\n theme,\n exitState,\n selectedModel,\n formFields,\n activeFieldIndex,\n setActiveFieldIndex,\n maxTokens,\n setMaxTokens,\n setSelectedMaxTokensPreset,\n setMaxTokensCursorOffset,\n reasoningEffortOptions,\n reasoningEffort,\n setReasoningEffort,\n}: Props) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Model Parameters{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Configure parameters for {selectedModel}:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n Use <Text color={theme.suggestion}>Tab</Text> to navigate between\n fields. Press <Text color={theme.suggestion}>Enter</Text> to\n submit.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n {formFields.map((field, index) => (\n <Box flexDirection=\"column\" marginY={1} key={field.name}>\n {field.component !== 'button' ? (\n <>\n <Text\n bold\n color={\n activeFieldIndex === index ? theme.success : undefined\n }\n >\n {field.label}\n </Text>\n {field.description && (\n <Text color={theme.secondaryText}>\n {field.description}\n </Text>\n )}\n </>\n ) : (\n <Text\n bold\n color={\n activeFieldIndex === index ? theme.success : undefined\n }\n >\n {field.label}\n </Text>\n )}\n <Box marginY={1}>\n {activeFieldIndex === index ? (\n field.component === 'select' ? (\n field.name === 'maxTokens' ? (\n <Select\n options={field.options || []}\n onChange={value => {\n const numValue = parseInt(value)\n setMaxTokens(numValue.toString())\n setSelectedMaxTokensPreset(numValue)\n setMaxTokensCursorOffset(numValue.toString().length)\n // Move to next field after selection\n setTimeout(() => {\n setActiveFieldIndex(index + 1)\n }, 100)\n }}\n defaultValue={field.defaultValue}\n visibleOptionCount={10}\n />\n ) : (\n <Select\n options={reasoningEffortOptions}\n onChange={value => {\n if (isReasoningEffortOption(value)) {\n setReasoningEffort(value)\n }\n // Move to next field after selection\n setTimeout(() => {\n setActiveFieldIndex(index + 1)\n }, 100)\n }}\n defaultValue={reasoningEffort ?? undefined}\n visibleOptionCount={8}\n />\n )\n ) : null\n ) : field.name === 'maxTokens' ? (\n <Text color={theme.secondaryText}>\n Current:{' '}\n <Text color={theme.suggestion}>\n {MAX_TOKENS_OPTIONS.find(\n opt => opt.value === parseInt(maxTokens),\n )?.label || `${maxTokens} tokens`}\n </Text>\n </Text>\n ) : field.name === 'reasoningEffort' ? (\n <Text color={theme.secondaryText}>\n Current:{' '}\n <Text color={theme.suggestion}>{reasoningEffort}</Text>\n </Text>\n ) : null}\n </Box>\n </Box>\n ))}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Tab</Text> to navigate,{' '}\n <Text color={theme.suggestion}>Enter</Text> to continue, or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport TextInput from '#ui-ink/components/TextInput'\n\nimport type { ModelInfo } from '../types'\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n selectedProvider: string\n availableModels: ModelInfo[]\n modelSearchQuery: string\n modelSearchCursorOffset: number\n handleModelSearchChange: (value: string) => void\n handleModelSearchCursorOffsetChange: (offset: number) => void\n modelOptions: Array<{ label: string; value: string }>\n handleModelSelection: (value: string) => void\n getProviderLabel: (provider: string, modelCount: number) => string\n}\n\nexport function ModelSelectionScreen({\n theme,\n exitState,\n selectedProvider,\n availableModels,\n modelSearchQuery,\n modelSearchCursorOffset,\n handleModelSearchChange,\n handleModelSearchCursorOffsetChange,\n modelOptions,\n handleModelSelection,\n getProviderLabel,\n}: Props) {\n const modelTypeText = 'this model profile'\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Model Selection{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n Select a model from{' '}\n {\n getProviderLabel(selectedProvider, availableModels.length).split(\n ' (',\n )[0]\n }{' '}\n for {modelTypeText}:\n </Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This model profile can be assigned to different pointers (main,\n task, compact, quick) for various use cases.\n </Text>\n </Box>\n\n <Box marginY={1}>\n <Text bold>Search models:</Text>\n <TextInput\n placeholder=\"Type to filter models...\"\n value={modelSearchQuery}\n onChange={handleModelSearchChange}\n columns={100}\n cursorOffset={modelSearchCursorOffset}\n onChangeCursorOffset={handleModelSearchCursorOffsetChange}\n showCursor={true}\n focus={true}\n />\n </Box>\n\n {modelOptions.length > 0 ? (\n <>\n <Select\n options={modelOptions}\n onChange={handleModelSelection}\n visibleOptionCount={15}\n />\n <Text dimColor>\n Showing {modelOptions.length} of {availableModels.length} models\n </Text>\n </>\n ) : (\n <Box>\n {availableModels.length > 0 ? (\n <Text color=\"yellow\">\n No models match your search. Try a different query.\n </Text>\n ) : (\n <Text color=\"yellow\">\n No models available for this provider.\n </Text>\n )}\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to API\n key input\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\ntype Option = { value: string; label: string }\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n containerPaddingY: number\n containerGap: number\n tightLayout: boolean\n compactLayout: boolean\n codingPlanOptions: Option[]\n codingPlanFocusIndex: number\n codingReservedLines: number\n getSafeVisibleOptionCount: (\n requestedCount: number,\n optionLength: number,\n reservedLines?: number,\n ) => number\n renderWindowedOptions: (\n options: Option[],\n focusedIndex: number,\n maxVisible: number,\n ) => React.ReactNode\n}\n\nexport function PartnerCodingPlansScreen({\n theme,\n exitState,\n containerPaddingY,\n containerGap,\n tightLayout,\n compactLayout,\n codingPlanOptions,\n codingPlanFocusIndex,\n codingReservedLines,\n getSafeVisibleOptionCount,\n renderWindowedOptions,\n}: Props) {\n const footerMarginTop = tightLayout ? 0 : 1\n return (\n <Box flexDirection=\"column\" gap={containerGap}>\n <Box\n flexDirection=\"column\"\n gap={containerGap}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={containerPaddingY}\n >\n <Text bold>\n Partner Coding Plans{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>\n Select a partner coding plan for specialized programming assistance:\n </Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n {compactLayout ? (\n 'Specialized coding models from partners.'\n ) : (\n <>\n These are specialized models optimized for coding and\n development tasks.\n <Newline />\n They require specific coding plan subscriptions from the\n respective providers.\n </>\n )}\n </Text>\n </Box>\n\n {renderWindowedOptions(\n codingPlanOptions,\n codingPlanFocusIndex,\n getSafeVisibleOptionCount(\n 5,\n codingPlanOptions.length,\n codingReservedLines,\n ),\n )}\n\n <Box marginTop={footerMarginTop}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to main\n menu\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\ntype Option = { value: string; label: string }\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n containerPaddingY: number\n containerGap: number\n compactLayout: boolean\n tightLayout: boolean\n partnerProviderOptions: Option[]\n partnerProviderFocusIndex: number\n partnerReservedLines: number\n getSafeVisibleOptionCount: (\n requestedCount: number,\n optionLength: number,\n reservedLines?: number,\n ) => number\n renderWindowedOptions: (\n options: Option[],\n focusedIndex: number,\n maxVisible: number,\n ) => React.ReactNode\n}\n\nexport function PartnerProvidersScreen({\n theme,\n exitState,\n containerPaddingY,\n containerGap,\n compactLayout,\n tightLayout,\n partnerProviderOptions,\n partnerProviderFocusIndex,\n partnerReservedLines,\n getSafeVisibleOptionCount,\n renderWindowedOptions,\n}: Props) {\n const footerMarginTop = tightLayout ? 0 : 1\n return (\n <Box flexDirection=\"column\" gap={containerGap}>\n <Box\n flexDirection=\"column\"\n gap={containerGap}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={containerPaddingY}\n >\n <Text bold>\n Partner Providers{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>Select a partner AI provider for this model profile:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n {compactLayout\n ? 'Choose an official partner provider.'\n : 'Choose from official partner providers to access their models and services.'}\n </Text>\n </Box>\n\n {renderWindowedOptions(\n partnerProviderOptions,\n partnerProviderFocusIndex,\n getSafeVisibleOptionCount(\n 6,\n partnerProviderOptions.length,\n partnerReservedLines,\n ),\n )}\n\n <Box marginTop={footerMarginTop}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to main\n menu\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport {\n ScreenContainer,\n type ScreenContainerExitState,\n} from '../ScreenContainer'\n\ntype Option = { value: string; label: string }\n\ntype Props = {\n theme: any\n exitState: ScreenContainerExitState\n containerPaddingY: number\n containerGap: number\n compactLayout: boolean\n tightLayout: boolean\n mainMenuOptions: Option[]\n providerFocusIndex: number\n providerReservedLines: number\n getSafeVisibleOptionCount: (\n requestedCount: number,\n optionLength: number,\n reservedLines?: number,\n ) => number\n renderWindowedOptions: (\n options: Option[],\n focusedIndex: number,\n maxVisible: number,\n ) => React.ReactNode\n}\n\nexport function ProviderSelectionScreen({\n theme,\n exitState,\n containerPaddingY,\n containerGap,\n compactLayout,\n tightLayout,\n mainMenuOptions,\n providerFocusIndex,\n providerReservedLines,\n getSafeVisibleOptionCount,\n renderWindowedOptions,\n}: Props) {\n return (\n <ScreenContainer\n title=\"Provider Selection\"\n exitState={exitState}\n paddingY={containerPaddingY}\n gap={containerGap}\n children={\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>\n Select your preferred AI provider for this model profile:\n </Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n {compactLayout ? (\n 'Choose the provider to use for this profile.'\n ) : (\n <>\n Choose the provider you want to use for this model profile.\n <Newline />\n This will determine which models are available to you.\n </>\n )}\n </Text>\n </Box>\n\n {renderWindowedOptions(\n mainMenuOptions,\n providerFocusIndex,\n getSafeVisibleOptionCount(\n 5,\n mainMenuOptions.length,\n providerReservedLines,\n ),\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n You can change this later by running{' '}\n <Text color={theme.suggestion}>/model</Text> again\n </Text>\n </Box>\n </Box>\n }\n />\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '#core/utils/theme'\n\nexport type ScreenContainerExitState = { pending: boolean; keyName: string }\n\ntype Props = {\n title: string\n exitState: ScreenContainerExitState\n children: React.ReactNode\n paddingY?: number\n gap?: number\n}\n\nexport function ScreenContainer({\n title,\n exitState,\n children,\n paddingY = 1,\n gap = 1,\n}: Props) {\n const theme = getTheme()\n return (\n <Box\n flexDirection=\"column\"\n gap={gap}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={paddingY}\n >\n <Text bold>\n {title}{' '}\n {exitState.pending ? `(press ${exitState.keyName} again to exit)` : ''}\n </Text>\n {children}\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport TextInput from '#ui-ink/components/TextInput'\n\ntype Props = {\n theme: any\n exitState: { pending: boolean; keyName: string }\n resourceName: string\n setResourceName: (value: string) => void\n handleResourceNameSubmit: (value: string) => void\n resourceNameCursorOffset: number\n setResourceNameCursorOffset: (value: number) => void\n}\n\nexport function ResourceNameScreen({\n theme,\n exitState,\n resourceName,\n setResourceName,\n handleResourceNameSubmit,\n resourceNameCursorOffset,\n setResourceNameCursorOffset,\n}: Props) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Azure Resource Setup{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Enter your Azure OpenAI resource name:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This is the name of your Azure OpenAI resource (without the full\n domain).\n <Newline />\n For example, if your endpoint is\n \"https://myresource.openai.azure.com\", enter \"myresource\".\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder=\"myazureresource\"\n value={resourceName}\n onChange={setResourceName}\n onSubmit={handleResourceNameSubmit}\n columns={100}\n cursorOffset={resourceNameCursorOffset}\n onChangeCursorOffset={setResourceNameCursorOffset}\n showCursor={true}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion} dimColor={!resourceName}>\n [Submit Resource Name]\n </Text>\n <Text> - Press Enter or click to continue</Text>\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import { useEffect, useMemo } from 'react'\nimport { useStdout } from 'ink'\nimport { getTheme } from '#core/utils/theme'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport {\n CONTEXT_LENGTH_OPTIONS,\n DEFAULT_CONTEXT_LENGTH,\n} from '#ui-ink/ui/components/model-selector/options'\nimport { printModelConfig } from '#ui-ink/ui/components/model-selector/printModelConfig'\nimport type { ModelSelectorProps } from './types'\nimport type { ModelSelectorViewProps } from './viewTypes'\nimport { useModelSelectorInput } from './useModelSelectorInput'\nimport { useModelSelectorMenus } from './useModelSelectorMenus'\nimport { useModelSelectorModelOptions } from './useModelSelectorModelOptions'\nimport { useModelSelectorState } from './useModelSelectorState'\nimport { useModelSelectorActions } from './useModelSelectorActions'\nimport { useEscapeNavigation } from '#ui-ink/ui/components/model-selector/useEscapeNavigation'\n\nexport function useModelSelectorController(\n props: ModelSelectorProps,\n): ModelSelectorViewProps {\n const theme = getTheme()\n const { stdout } = useStdout()\n const terminalRows = stdout?.rows ?? 24\n const compactLayout = terminalRows <= 22\n const tightLayout = terminalRows <= 18\n const containerPaddingY = tightLayout ? 0 : compactLayout ? 0 : 1\n const containerGap = tightLayout ? 0 : 1\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n const exitStateForScreens = useMemo(\n () => ({ pending: exitState.pending, keyName: exitState.keyName ?? '' }),\n [exitState.pending, exitState.keyName],\n )\n\n const onDone = () => {\n printModelConfig()\n props.onDone()\n }\n\n const state = useModelSelectorState({\n skipModelType: props.skipModelType ?? false,\n })\n\n const menus = useModelSelectorMenus({\n containerPaddingY,\n containerGap,\n setProviderFocusIndex: state.setProviderFocusIndex,\n setPartnerProviderFocusIndex: state.setPartnerProviderFocusIndex,\n setCodingPlanFocusIndex: state.setCodingPlanFocusIndex,\n })\n\n const { modelOptions } = useModelSelectorModelOptions({\n selectedProvider: state.selectedProvider,\n availableModels: state.availableModels,\n modelSearchQuery: state.modelSearchQuery,\n })\n\n useEffect(() => {\n if (!state.apiKeyEdited && state.selectedProvider) {\n const envKey = `${state.selectedProvider.toUpperCase()}_API_KEY`\n if (process.env[envKey]) {\n state.setApiKey(process.env[envKey] as string)\n } else {\n state.setApiKey('')\n }\n }\n }, [state.apiKeyEdited, state.selectedProvider, state.setApiKey])\n\n useEffect(() => {\n if (\n state.currentScreen === 'contextLength' &&\n !CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === state.contextLength)\n ) {\n state.setContextLength(DEFAULT_CONTEXT_LENGTH)\n }\n }, [state.contextLength, state.currentScreen, state.setContextLength])\n\n const actions = useModelSelectorActions({ props, state, onDone })\n\n useEscapeNavigation(actions.handleBack, props.abortController)\n\n useModelSelectorInput({\n currentScreen: state.currentScreen,\n mainMenuOptions: menus.mainMenuOptions,\n providerFocusIndex: state.providerFocusIndex,\n setProviderFocusIndex: state.setProviderFocusIndex,\n partnerProviderOptions: menus.partnerProviderOptions,\n partnerProviderFocusIndex: state.partnerProviderFocusIndex,\n setPartnerProviderFocusIndex: state.setPartnerProviderFocusIndex,\n codingPlanOptions: menus.codingPlanOptions,\n codingPlanFocusIndex: state.codingPlanFocusIndex,\n setCodingPlanFocusIndex: state.setCodingPlanFocusIndex,\n selectedProvider: state.selectedProvider,\n apiKey: state.apiKey,\n resourceName: state.resourceName,\n providerBaseUrl: state.providerBaseUrl,\n customBaseUrl: state.customBaseUrl,\n customModelName: state.customModelName,\n contextLength: state.contextLength,\n setContextLength: state.setContextLength,\n isTestingConnection: state.isTestingConnection,\n connectionTestResult: state.connectionTestResult,\n activeFieldIndex: state.activeFieldIndex,\n setActiveFieldIndex: state.setActiveFieldIndex,\n handleProviderSelection: actions.handleProviderSelection,\n handleApiKeySubmit: actions.handleApiKeySubmit,\n fetchModelsWithRetry: actions.fetchModelsWithRetry,\n navigateTo: state.navigateTo,\n handleResourceNameSubmit: actions.handleResourceNameSubmit,\n handleCustomBaseUrlSubmit: actions.handleCustomBaseUrlSubmit,\n handleProviderBaseUrlSubmit: actions.handleProviderBaseUrlSubmit,\n handleCustomModelSubmit: actions.handleCustomModelSubmit,\n handleConfirmation: actions.handleConfirmation,\n setValidationError: state.setValidationError,\n handleConnectionTest: actions.handleConnectionTest,\n handleContextLengthSubmit: actions.handleContextLengthSubmit,\n setModelLoadError: state.setModelLoadError,\n getFormFieldsForModelParams: actions.getFormFieldsForModelParams,\n handleModelParamsSubmit: actions.handleModelParamsSubmit,\n })\n\n return {\n theme,\n exitState: exitStateForScreens,\n terminalRows,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n currentScreen: state.currentScreen,\n selectedProvider: state.selectedProvider,\n selectedModel: state.selectedModel,\n apiKey: state.apiKey,\n cursorOffset: state.cursorOffset,\n handleApiKeyChange: actions.handleApiKeyChange,\n handleApiKeySubmit: actions.handleApiKeySubmit,\n handleCursorOffsetChange: actions.handleCursorOffsetChange,\n apiKeyCleanedNotification: state.apiKeyCleanedNotification,\n isLoadingModels: state.isLoadingModels,\n modelLoadError: state.modelLoadError,\n providerBaseUrl: state.providerBaseUrl,\n setProviderBaseUrl: state.setProviderBaseUrl,\n providerBaseUrlCursorOffset: state.providerBaseUrlCursorOffset,\n setProviderBaseUrlCursorOffset: state.setProviderBaseUrlCursorOffset,\n customBaseUrl: state.customBaseUrl,\n setCustomBaseUrl: state.setCustomBaseUrl,\n customBaseUrlCursorOffset: state.customBaseUrlCursorOffset,\n setCustomBaseUrlCursorOffset: state.setCustomBaseUrlCursorOffset,\n customModelName: state.customModelName,\n setCustomModelName: state.setCustomModelName,\n customModelNameCursorOffset: state.customModelNameCursorOffset,\n setCustomModelNameCursorOffset: state.setCustomModelNameCursorOffset,\n resourceName: state.resourceName,\n setResourceName: state.setResourceName,\n resourceNameCursorOffset: state.resourceNameCursorOffset,\n setResourceNameCursorOffset: state.setResourceNameCursorOffset,\n availableModels: state.availableModels,\n modelSearchQuery: state.modelSearchQuery,\n modelSearchCursorOffset: state.modelSearchCursorOffset,\n handleModelSearchChange: actions.handleModelSearchChange,\n handleModelSearchCursorOffsetChange:\n actions.handleModelSearchCursorOffsetChange,\n modelOptions,\n handleResourceNameSubmit: actions.handleResourceNameSubmit,\n handleCustomBaseUrlSubmit: actions.handleCustomBaseUrlSubmit,\n handleProviderBaseUrlSubmit: actions.handleProviderBaseUrlSubmit,\n handleCustomModelSubmit: actions.handleCustomModelSubmit,\n handleModelSelection: actions.handleModelSelection,\n handleModelParamsSubmit: actions.handleModelParamsSubmit,\n maxTokens: state.maxTokens,\n setMaxTokens: state.setMaxTokens,\n setSelectedMaxTokensPreset: state.setSelectedMaxTokensPreset,\n setMaxTokensCursorOffset: state.setMaxTokensCursorOffset,\n supportsReasoningEffort: state.supportsReasoningEffort,\n reasoningEffortOptions: actions.reasoningEffortOptions,\n reasoningEffort: state.reasoningEffort,\n setReasoningEffort: state.setReasoningEffort,\n contextLength: state.contextLength,\n isTestingConnection: state.isTestingConnection,\n connectionTestResult: state.connectionTestResult,\n validationError: state.validationError,\n ollamaBaseUrl: state.ollamaBaseUrl,\n activeFieldIndex: state.activeFieldIndex,\n setActiveFieldIndex: state.setActiveFieldIndex,\n getFormFieldsForModelParams: actions.getFormFieldsForModelParams,\n mainMenuOptions: menus.mainMenuOptions,\n providerFocusIndex: state.providerFocusIndex,\n providerReservedLines: menus.providerReservedLines,\n partnerProviderOptions: menus.partnerProviderOptions,\n partnerProviderFocusIndex: state.partnerProviderFocusIndex,\n partnerReservedLines: menus.partnerReservedLines,\n codingPlanOptions: menus.codingPlanOptions,\n codingPlanFocusIndex: state.codingPlanFocusIndex,\n codingReservedLines: menus.codingReservedLines,\n formatApiKeyDisplay: actions.formatApiKeyDisplay,\n getProviderLabel: menus.getProviderLabel,\n }\n}\n", "import chalk from 'chalk'\nimport { getGlobalConfig } from '#core/utils/config'\n\nexport function printModelConfig() {\n const config = getGlobalConfig()\n const modelProfiles = config.modelProfiles || []\n const activeProfiles = modelProfiles.filter(p => p.isActive)\n\n if (activeProfiles.length === 0) {\n process.stdout.write(\n `${chalk.gray(' \u23BF No active model profiles configured')}\\n`,\n )\n return\n }\n\n const profileSummary = activeProfiles\n .map(p => `${p.name} (${p.provider}: ${p.modelName})`)\n .join(' | ')\n process.stdout.write(`${chalk.gray(` \u23BF ${profileSummary}`)}\\n`)\n}\n", "import { useInput } from 'ink'\nimport {\n CONTEXT_LENGTH_OPTIONS,\n DEFAULT_CONTEXT_LENGTH,\n} from '#ui-ink/ui/components/model-selector/options'\nimport type { ModelSelectorScreen } from '#ui-ink/ui/components/model-selector/state'\nimport type { ConnectionTestResult } from '#ui-ink/ui/components/model-selector/actions/connectionTest'\nimport type { ProviderType } from '#core/utils/config'\n\ntype Option = { value: string; label: string }\n\nexport function useModelSelectorInput(args: {\n currentScreen: ModelSelectorScreen\n mainMenuOptions: Option[]\n providerFocusIndex: number\n setProviderFocusIndex: (value: number | ((prev: number) => number)) => void\n partnerProviderOptions: Option[]\n partnerProviderFocusIndex: number\n setPartnerProviderFocusIndex: (\n value: number | ((prev: number) => number),\n ) => void\n codingPlanOptions: Option[]\n codingPlanFocusIndex: number\n setCodingPlanFocusIndex: (value: number | ((prev: number) => number)) => void\n\n selectedProvider: ProviderType\n apiKey: string\n resourceName: string\n providerBaseUrl: string\n customBaseUrl: string\n customModelName: string\n\n contextLength: number\n setContextLength: (value: number) => void\n\n isTestingConnection: boolean\n connectionTestResult: ConnectionTestResult | null\n\n activeFieldIndex: number\n setActiveFieldIndex: (value: number | ((prev: number) => number)) => void\n\n handleProviderSelection: (provider: string) => void\n handleApiKeySubmit: (key: string) => void | Promise<void>\n fetchModelsWithRetry: () => Promise<unknown>\n navigateTo: (screen: ModelSelectorScreen) => void\n handleResourceNameSubmit: (name: string) => void\n handleCustomBaseUrlSubmit: (url: string) => void\n handleProviderBaseUrlSubmit: (url: string) => void\n handleCustomModelSubmit: (model: string) => void\n handleConfirmation: () => Promise<void>\n setValidationError: (value: string | null) => void\n handleConnectionTest: () => void\n handleContextLengthSubmit: () => void\n setModelLoadError: (value: string | null) => void\n getFormFieldsForModelParams: () => Array<{ name: string; component: string }>\n handleModelParamsSubmit: () => void\n}) {\n useInput((input, key) => {\n if (args.currentScreen === 'provider') {\n if (key.upArrow) {\n args.setProviderFocusIndex(prev =>\n args.mainMenuOptions.length === 0\n ? 0\n : (prev - 1 + args.mainMenuOptions.length) %\n args.mainMenuOptions.length,\n )\n return\n }\n if (key.downArrow) {\n args.setProviderFocusIndex(prev =>\n args.mainMenuOptions.length === 0\n ? 0\n : (prev + 1) % args.mainMenuOptions.length,\n )\n return\n }\n if (key.return) {\n const opt = args.mainMenuOptions[args.providerFocusIndex]\n if (opt) {\n args.handleProviderSelection(opt.value)\n }\n return\n }\n }\n\n if (args.currentScreen === 'partnerProviders') {\n if (key.upArrow) {\n args.setPartnerProviderFocusIndex(prev =>\n args.partnerProviderOptions.length === 0\n ? 0\n : (prev - 1 + args.partnerProviderOptions.length) %\n args.partnerProviderOptions.length,\n )\n return\n }\n if (key.downArrow) {\n args.setPartnerProviderFocusIndex(prev =>\n args.partnerProviderOptions.length === 0\n ? 0\n : (prev + 1) % args.partnerProviderOptions.length,\n )\n return\n }\n if (key.return) {\n const opt = args.partnerProviderOptions[args.partnerProviderFocusIndex]\n if (opt) {\n args.handleProviderSelection(opt.value)\n }\n return\n }\n }\n\n if (args.currentScreen === 'partnerCodingPlans') {\n if (key.upArrow) {\n args.setCodingPlanFocusIndex(prev =>\n args.codingPlanOptions.length === 0\n ? 0\n : (prev - 1 + args.codingPlanOptions.length) %\n args.codingPlanOptions.length,\n )\n return\n }\n if (key.downArrow) {\n args.setCodingPlanFocusIndex(prev =>\n args.codingPlanOptions.length === 0\n ? 0\n : (prev + 1) % args.codingPlanOptions.length,\n )\n return\n }\n if (key.return) {\n const opt = args.codingPlanOptions[args.codingPlanFocusIndex]\n if (opt) {\n args.handleProviderSelection(opt.value)\n }\n return\n }\n }\n\n if (args.currentScreen === 'apiKey' && key.return) {\n if (args.apiKey) {\n void args.handleApiKeySubmit(args.apiKey)\n }\n return\n }\n\n if (args.currentScreen === 'apiKey' && key.tab) {\n if (\n args.selectedProvider === 'anthropic' ||\n args.selectedProvider === 'kimi' ||\n args.selectedProvider === 'deepseek' ||\n args.selectedProvider === 'qwen' ||\n args.selectedProvider === 'glm' ||\n args.selectedProvider === 'glm-coding' ||\n args.selectedProvider === 'minimax' ||\n args.selectedProvider === 'minimax-coding' ||\n args.selectedProvider === 'baidu-qianfan' ||\n args.selectedProvider === 'siliconflow' ||\n args.selectedProvider === 'custom-openai'\n ) {\n args.navigateTo('modelInput')\n return\n }\n\n void args.fetchModelsWithRetry().catch(error => {\n console.error('Final error after retries:', error)\n })\n return\n }\n\n if (args.currentScreen === 'resourceName' && key.return) {\n if (args.resourceName) {\n args.handleResourceNameSubmit(args.resourceName)\n }\n return\n }\n\n if (args.currentScreen === 'baseUrl' && key.return) {\n if (args.selectedProvider === 'custom-openai') {\n args.handleCustomBaseUrlSubmit(args.customBaseUrl)\n } else {\n args.handleProviderBaseUrlSubmit(args.providerBaseUrl)\n }\n return\n }\n\n if (args.currentScreen === 'modelInput' && key.return) {\n if (args.customModelName) {\n args.handleCustomModelSubmit(args.customModelName)\n }\n return\n }\n\n if (args.currentScreen === 'confirmation' && key.return) {\n void args.handleConfirmation().catch(error => {\n console.error('Error in handleConfirmation:', error)\n args.setValidationError(\n error instanceof Error ? error.message : 'Unexpected error occurred',\n )\n })\n return\n }\n\n if (args.currentScreen === 'connectionTest') {\n if (key.return) {\n if (!args.isTestingConnection && !args.connectionTestResult) {\n args.handleConnectionTest()\n } else if (\n args.connectionTestResult &&\n args.connectionTestResult.success\n ) {\n args.navigateTo('confirmation')\n } else if (\n args.connectionTestResult &&\n !args.connectionTestResult.success\n ) {\n args.handleConnectionTest()\n }\n return\n }\n }\n\n if (args.currentScreen === 'contextLength') {\n if (key.return) {\n args.handleContextLengthSubmit()\n return\n }\n\n if (key.upArrow) {\n const currentIndex = CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === args.contextLength,\n )\n const newIndex =\n currentIndex > 0\n ? currentIndex - 1\n : currentIndex === -1\n ? CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === DEFAULT_CONTEXT_LENGTH,\n ) || 0\n : CONTEXT_LENGTH_OPTIONS.length - 1\n args.setContextLength(CONTEXT_LENGTH_OPTIONS[newIndex].value)\n return\n }\n\n if (key.downArrow) {\n const currentIndex = CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === args.contextLength,\n )\n const newIndex =\n currentIndex === -1\n ? CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === DEFAULT_CONTEXT_LENGTH,\n ) || 0\n : (currentIndex + 1) % CONTEXT_LENGTH_OPTIONS.length\n args.setContextLength(CONTEXT_LENGTH_OPTIONS[newIndex].value)\n return\n }\n }\n\n if (\n args.currentScreen === 'apiKey' &&\n ((key.ctrl && input === 'v') || (key.meta && input === 'v'))\n ) {\n args.setModelLoadError(\n \"Please use your terminal's paste functionality or type the API key manually\",\n )\n return\n }\n\n if (args.currentScreen === 'modelParams' && key.tab) {\n const formFields = args.getFormFieldsForModelParams()\n args.setActiveFieldIndex(current => (current + 1) % formFields.length)\n return\n }\n\n if (args.currentScreen === 'modelParams' && key.return) {\n const formFields = args.getFormFieldsForModelParams()\n const currentField = formFields[args.activeFieldIndex]\n\n if (\n currentField?.name === 'submit' ||\n args.activeFieldIndex === formFields.length - 1\n ) {\n args.handleModelParamsSubmit()\n } else if (currentField?.component === 'select') {\n args.setActiveFieldIndex(current =>\n Math.min(current + 1, formFields.length - 1),\n )\n }\n return\n }\n })\n}\n", "import { useEffect, useMemo } from 'react'\nimport models, { providers } from '#core/constants/models'\n\ntype Option = { value: string; label: string }\n\nexport function useModelSelectorMenus(args: {\n containerPaddingY: number\n containerGap: number\n setProviderFocusIndex: (value: number | ((prev: number) => number)) => void\n setPartnerProviderFocusIndex: (\n value: number | ((prev: number) => number),\n ) => void\n setCodingPlanFocusIndex: (value: number | ((prev: number) => number)) => void\n}) {\n function getProviderLabel(provider: string, modelCount: number): string {\n if (providers[provider]) {\n const wipTag = '(' + 'WI' + 'P' + ')'\n return `${providers[provider].name} ${providers[provider].status === 'wip' ? wipTag : ''}`\n }\n return `${provider}`\n }\n\n const mainMenuOptions: Option[] = useMemo(\n () => [\n { value: 'custom-openai', label: 'Custom OpenAI-Compatible API' },\n { value: 'custom-anthropic', label: 'Custom Messages API (v1/messages)' },\n { value: 'partnerProviders', label: 'Partner Providers \u2192' },\n { value: 'partnerCodingPlans', label: 'Partner Coding Plans \u2192' },\n {\n value: 'ollama',\n label: getProviderLabel('ollama', models.ollama?.length || 0),\n },\n ],\n [],\n )\n\n const rankedProviders = useMemo(\n () => [\n 'openai',\n 'anthropic',\n 'gemini',\n 'glm',\n 'kimi',\n 'minimax',\n 'qwen',\n 'deepseek',\n 'openrouter',\n 'burncloud',\n 'siliconflow',\n 'baidu-qianfan',\n 'mistral',\n 'xai',\n 'groq',\n 'azure',\n ],\n [],\n )\n\n const partnerProviders = useMemo(\n () =>\n rankedProviders.filter(\n provider =>\n providers[provider] &&\n !provider.includes('coding') &&\n provider !== 'custom-openai' &&\n provider !== 'ollama',\n ),\n [rankedProviders],\n )\n\n const codingPlanProviders = useMemo(\n () =>\n Object.keys(providers).filter(provider => provider.includes('coding')),\n [],\n )\n\n const partnerProviderOptions: Option[] = useMemo(\n () =>\n partnerProviders.map(provider => {\n const modelCount = models[provider]?.length || 0\n return {\n label: getProviderLabel(provider, modelCount),\n value: provider,\n }\n }),\n [partnerProviders],\n )\n\n const codingPlanOptions: Option[] = useMemo(\n () =>\n codingPlanProviders.map(provider => {\n const modelCount = models[provider]?.length || 0\n return {\n label: getProviderLabel(provider, modelCount),\n value: provider,\n }\n }),\n [codingPlanProviders],\n )\n\n const providerReservedLines =\n 8 + args.containerPaddingY * 2 + args.containerGap * 2\n const partnerReservedLines =\n 10 + args.containerPaddingY * 2 + args.containerGap * 3\n const codingReservedLines = partnerReservedLines\n\n const clampIndex = (index: number, length: number) =>\n length === 0 ? 0 : Math.max(0, Math.min(index, length - 1))\n\n useEffect(() => {\n args.setProviderFocusIndex(prev => clampIndex(prev, mainMenuOptions.length))\n }, [args, mainMenuOptions.length])\n\n useEffect(() => {\n args.setPartnerProviderFocusIndex(prev =>\n clampIndex(prev, partnerProviderOptions.length),\n )\n }, [args, partnerProviderOptions.length])\n\n useEffect(() => {\n args.setCodingPlanFocusIndex(prev =>\n clampIndex(prev, codingPlanOptions.length),\n )\n }, [args, codingPlanOptions.length])\n\n return {\n mainMenuOptions,\n partnerProviderOptions,\n codingPlanOptions,\n providerReservedLines,\n partnerReservedLines,\n codingReservedLines,\n getProviderLabel,\n }\n}\n", "import { useMemo } from 'react'\nimport models from '#core/constants/models'\nimport type { ModelInfo } from '#ui-ink/ui/components/model-selector/types'\n\nfunction formatNumber(num: number): string {\n if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`\n if (num >= 1000) return `${(num / 1000).toFixed(0)}K`\n return num.toString()\n}\n\nfunction getModelDetails(model: ModelInfo): string {\n const details = []\n if (model.context_length) {\n details.push(`${formatNumber(model.context_length)} tokens`)\n } else if (model.max_tokens) {\n details.push(`${formatNumber(model.max_tokens)} tokens`)\n }\n if (model.supports_vision) details.push('vision')\n if (model.supports_function_calling) details.push('tools')\n return details.length > 0 ? ` (${details.join(', ')})` : ''\n}\n\nfunction sortModelsByPriority(models: ModelInfo[]) {\n const priorityKeywords = [\n 'claude',\n 'kimi',\n 'deepseek',\n 'minimax',\n 'o3',\n 'gpt',\n 'qwen',\n ]\n\n return models.sort((a, b) => {\n const aModelLower = a.model?.toLowerCase() || ''\n const bModelLower = b.model?.toLowerCase() || ''\n\n const aHasPriority = priorityKeywords.some(keyword =>\n aModelLower.includes(keyword),\n )\n const bHasPriority = priorityKeywords.some(keyword =>\n bModelLower.includes(keyword),\n )\n\n if (aHasPriority && !bHasPriority) return -1\n if (!aHasPriority && bHasPriority) return 1\n\n return a.model.localeCompare(b.model)\n })\n}\n\nexport function useModelSelectorModelOptions(args: {\n selectedProvider: string\n availableModels: ModelInfo[]\n modelSearchQuery: string\n}) {\n const ourModelNames = useMemo(() => {\n return new Set(\n (models[args.selectedProvider as keyof typeof models] || []).map(\n (model: any) => model.model,\n ),\n )\n }, [args.selectedProvider])\n\n const filteredModels = useMemo(() => {\n return args.modelSearchQuery\n ? args.availableModels.filter(model =>\n model.model\n ?.toLowerCase()\n .includes(args.modelSearchQuery.toLowerCase()),\n )\n : args.availableModels\n }, [args.availableModels, args.modelSearchQuery])\n\n const sortedFilteredModels = useMemo(\n () => sortModelsByPriority([...filteredModels]),\n [filteredModels],\n )\n\n const modelOptions = useMemo(\n () =>\n sortedFilteredModels.map(model => {\n const _isInOurModels = ourModelNames.has(model.model)\n return {\n label: `${model.model}${getModelDetails(model)}`,\n value: model.model,\n }\n }),\n [ourModelNames, sortedFilteredModels],\n )\n\n return { modelOptions }\n}\n", "import { useState } from 'react'\nimport { getGlobalConfig, type ProviderType } from '#core/utils/config'\nimport type { ConnectionTestResult } from '#ui-ink/ui/components/model-selector/actions/connectionTest'\nimport {\n DEFAULT_CONTEXT_LENGTH,\n DEFAULT_MAX_TOKENS,\n type ReasoningEffortOption,\n} from '#ui-ink/ui/components/model-selector/options'\nimport {\n createInitialScreenStack,\n getCurrentScreen,\n pushScreen,\n type ModelSelectorScreen,\n} from '#ui-ink/ui/components/model-selector/state'\nimport type { ModelInfo } from '#ui-ink/ui/components/model-selector/types'\n\nexport function useModelSelectorState(opts: { skipModelType: boolean }) {\n const config = getGlobalConfig()\n\n const [screenStack, setScreenStack] = useState<ModelSelectorScreen[]>(() =>\n createInitialScreenStack({ skipModelType: opts.skipModelType }),\n )\n\n const currentScreen = getCurrentScreen(screenStack)\n const navigateTo = (screen: ModelSelectorScreen) => {\n setScreenStack(prev => pushScreen(prev, screen))\n }\n\n const [selectedProvider, setSelectedProvider] = useState<ProviderType>(\n config.primaryProvider ?? 'anthropic',\n )\n const [selectedModel, setSelectedModel] = useState<string>('')\n const [apiKey, setApiKey] = useState<string>('')\n\n const [maxTokens, setMaxTokens] = useState<string>(\n config.maxTokens?.toString() || DEFAULT_MAX_TOKENS.toString(),\n )\n const [maxTokensMode, setMaxTokensMode] = useState<'preset' | 'custom'>(\n 'preset',\n )\n const [selectedMaxTokensPreset, setSelectedMaxTokensPreset] =\n useState<number>(config.maxTokens || DEFAULT_MAX_TOKENS)\n const [reasoningEffort, setReasoningEffort] =\n useState<ReasoningEffortOption | null>('medium')\n const [supportsReasoningEffort, setSupportsReasoningEffort] =\n useState<boolean>(false)\n\n const [contextLength, setContextLength] = useState<number>(\n DEFAULT_CONTEXT_LENGTH,\n )\n\n const [activeFieldIndex, setActiveFieldIndex] = useState(0)\n const [maxTokensCursorOffset, setMaxTokensCursorOffset] = useState<number>(0)\n\n const [apiKeyCleanedNotification, setApiKeyCleanedNotification] =\n useState<boolean>(false)\n\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([])\n const [isLoadingModels, setIsLoadingModels] = useState(false)\n const [modelLoadError, setModelLoadError] = useState<string | null>(null)\n const [modelSearchQuery, setModelSearchQuery] = useState<string>('')\n const [modelSearchCursorOffset, setModelSearchCursorOffset] =\n useState<number>(0)\n const [cursorOffset, setCursorOffset] = useState<number>(0)\n const [apiKeyEdited, setApiKeyEdited] = useState<boolean>(false)\n\n const [providerFocusIndex, setProviderFocusIndex] = useState(0)\n const [partnerProviderFocusIndex, setPartnerProviderFocusIndex] = useState(0)\n const [codingPlanFocusIndex, setCodingPlanFocusIndex] = useState(0)\n\n const [fetchRetryCount, setFetchRetryCount] = useState<number>(0)\n const [isRetrying, setIsRetrying] = useState<boolean>(false)\n\n const [isTestingConnection, setIsTestingConnection] = useState<boolean>(false)\n const [connectionTestResult, setConnectionTestResult] =\n useState<ConnectionTestResult | null>(null)\n\n const [validationError, setValidationError] = useState<string | null>(null)\n\n const [resourceName, setResourceName] = useState<string>('')\n const [resourceNameCursorOffset, setResourceNameCursorOffset] =\n useState<number>(0)\n const [customModelName, setCustomModelName] = useState<string>('')\n const [customModelNameCursorOffset, setCustomModelNameCursorOffset] =\n useState<number>(0)\n\n const [ollamaBaseUrl, setOllamaBaseUrl] = useState<string>(\n 'http://localhost:11434/v1',\n )\n\n const [customBaseUrl, setCustomBaseUrl] = useState<string>('')\n const [customBaseUrlCursorOffset, setCustomBaseUrlCursorOffset] =\n useState<number>(0)\n\n const [providerBaseUrl, setProviderBaseUrl] = useState<string>('')\n const [providerBaseUrlCursorOffset, setProviderBaseUrlCursorOffset] =\n useState<number>(0)\n\n return {\n screenStack,\n setScreenStack,\n currentScreen,\n navigateTo,\n selectedProvider,\n setSelectedProvider,\n selectedModel,\n setSelectedModel,\n apiKey,\n setApiKey,\n maxTokens,\n setMaxTokens,\n maxTokensMode,\n setMaxTokensMode,\n selectedMaxTokensPreset,\n setSelectedMaxTokensPreset,\n reasoningEffort,\n setReasoningEffort,\n supportsReasoningEffort,\n setSupportsReasoningEffort,\n contextLength,\n setContextLength,\n activeFieldIndex,\n setActiveFieldIndex,\n maxTokensCursorOffset,\n setMaxTokensCursorOffset,\n apiKeyCleanedNotification,\n setApiKeyCleanedNotification,\n availableModels,\n setAvailableModels,\n isLoadingModels,\n setIsLoadingModels,\n modelLoadError,\n setModelLoadError,\n modelSearchQuery,\n setModelSearchQuery,\n modelSearchCursorOffset,\n setModelSearchCursorOffset,\n cursorOffset,\n setCursorOffset,\n apiKeyEdited,\n setApiKeyEdited,\n providerFocusIndex,\n setProviderFocusIndex,\n partnerProviderFocusIndex,\n setPartnerProviderFocusIndex,\n codingPlanFocusIndex,\n setCodingPlanFocusIndex,\n fetchRetryCount,\n setFetchRetryCount,\n isRetrying,\n setIsRetrying,\n isTestingConnection,\n setIsTestingConnection,\n connectionTestResult,\n setConnectionTestResult,\n validationError,\n setValidationError,\n resourceName,\n setResourceName,\n resourceNameCursorOffset,\n setResourceNameCursorOffset,\n customModelName,\n setCustomModelName,\n customModelNameCursorOffset,\n setCustomModelNameCursorOffset,\n ollamaBaseUrl,\n setOllamaBaseUrl,\n customBaseUrl,\n setCustomBaseUrl,\n customBaseUrlCursorOffset,\n setCustomBaseUrlCursorOffset,\n providerBaseUrl,\n setProviderBaseUrl,\n providerBaseUrlCursorOffset,\n setProviderBaseUrlCursorOffset,\n }\n}\n\nexport type ModelSelectorState = ReturnType<typeof useModelSelectorState>\n", "export type ModelSelectorScreen =\n | 'provider'\n | 'partnerProviders'\n | 'partnerCodingPlans'\n | 'apiKey'\n | 'resourceName'\n | 'baseUrl'\n | 'model'\n | 'modelInput'\n | 'modelParams'\n | 'contextLength'\n | 'connectionTest'\n | 'confirmation'\n\nexport type ModelSelectorScreenStack = ModelSelectorScreen[]\n\nexport type BackEffect =\n | { type: 'exit' }\n | { type: 'resetProviderFocus' }\n | null\n\nexport function createInitialScreenStack(_opts?: {\n skipModelType?: boolean\n}): ModelSelectorScreenStack {\n return ['provider']\n}\n\nexport function getCurrentScreen(\n stack: ModelSelectorScreenStack,\n): ModelSelectorScreen {\n return stack[stack.length - 1] ?? 'provider'\n}\n\nexport function pushScreen(\n stack: ModelSelectorScreenStack,\n screen: ModelSelectorScreen,\n): ModelSelectorScreenStack {\n return [...stack, screen]\n}\n\nexport function popScreen(\n stack: ModelSelectorScreenStack,\n): ModelSelectorScreenStack {\n if (stack.length > 1) {\n return stack.slice(0, -1)\n }\n return stack\n}\n\nexport function handleBackNavigation(stack: ModelSelectorScreenStack): {\n stack: ModelSelectorScreenStack\n effect: BackEffect\n} {\n const currentScreen = getCurrentScreen(stack)\n\n // Special handling for submenus - they should go back to main menu\n if (\n currentScreen === 'partnerProviders' ||\n currentScreen === 'partnerCodingPlans'\n ) {\n return { stack: ['provider'], effect: { type: 'resetProviderFocus' } }\n }\n\n // If we're at the main provider screen, exit\n if (currentScreen === 'provider') {\n return { stack, effect: { type: 'exit' } }\n }\n\n // For all other screens, normal back navigation\n if (stack.length > 1) {\n return { stack: stack.slice(0, -1), effect: null }\n }\n\n // Fallback to provider screen\n return { stack: ['provider'], effect: { type: 'resetProviderFocus' } }\n}\n", "import type { ProviderType } from '#core/utils/config'\n\nconst OPENAI_COMPATIBLE_PROVIDERS: ReadonlySet<ProviderType> = new Set([\n 'minimax',\n 'kimi',\n 'deepseek',\n 'siliconflow',\n 'qwen',\n 'glm',\n 'baidu-qianfan',\n 'openai',\n 'mistral',\n 'xai',\n 'groq',\n 'custom-openai',\n])\n\nexport function isOpenAICompatibleProvider(provider: ProviderType): boolean {\n return OPENAI_COMPATIBLE_PROVIDERS.has(provider)\n}\n", "import type { ProviderType } from '#core/utils/config'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport type { ConnectionTestResult } from './types'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n if (Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\nexport async function testChatEndpoint({\n baseURL,\n endpointPath,\n endpointName,\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n}: {\n baseURL: string\n endpointPath: string\n endpointName: string\n selectedProvider: ProviderType\n selectedModel: string\n apiKey: string\n maxTokens: string\n}): Promise<ConnectionTestResult> {\n const testURL = `${baseURL.replace(/\\/+$/, '')}${endpointPath}`\n\n const testPayload: Record<string, unknown> = {\n model: selectedModel,\n messages: [\n {\n role: 'user',\n content:\n 'Please respond with exactly \\\"YES\\\" (in capital letters) to confirm this connection is working.',\n },\n ],\n max_tokens: Math.max(parseInt(maxTokens) || 8192, 8192),\n temperature: 0,\n stream: false,\n }\n\n if (selectedModel && selectedModel.toLowerCase().includes('gpt-5')) {\n debugLogger.api('GPT5_PARAMETER_FIX_APPLY', { model: selectedModel })\n\n if (typeof testPayload.max_tokens === 'number') {\n testPayload.max_completion_tokens = testPayload.max_tokens\n delete testPayload.max_tokens\n debugLogger.api('GPT5_PARAMETER_FIX_MAX_TOKENS', {\n model: selectedModel,\n max_completion_tokens: testPayload.max_completion_tokens,\n })\n }\n\n if (\n typeof testPayload.temperature === 'number' &&\n testPayload.temperature !== 1\n ) {\n debugLogger.api('GPT5_PARAMETER_FIX_TEMPERATURE', {\n model: selectedModel,\n from: testPayload.temperature,\n to: 1,\n })\n testPayload.temperature = 1\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (selectedProvider === 'azure') {\n headers['api-key'] = apiKey\n } else {\n headers['Authorization'] = `Bearer ${apiKey}`\n }\n\n try {\n const response = await fetch(testURL, {\n method: 'POST',\n headers,\n body: JSON.stringify(testPayload),\n })\n\n if (response.ok) {\n const data = (await response.json()) as unknown\n debugLogger.api('CONNECTION_TEST_RESPONSE', {\n provider: selectedProvider,\n endpoint: endpointPath,\n ok: true,\n })\n\n let responseContent = ''\n const record = data as Record<string, unknown> | null\n if (\n record &&\n Array.isArray(record.choices) &&\n record.choices.length > 0\n ) {\n const firstChoice = record.choices[0] as Record<string, unknown> | null\n const message =\n (firstChoice?.message as Record<string, unknown> | null) ?? null\n responseContent = String(message?.content ?? '')\n } else if (record && typeof record.reply === 'string') {\n responseContent = record.reply\n } else if (record && record.output) {\n const output = record.output as Record<string, unknown> | null\n responseContent = String(output?.text ?? record.output ?? '')\n }\n\n debugLogger.api('CONNECTION_TEST_RESPONSE_PARSED', {\n provider: selectedProvider,\n endpoint: endpointPath,\n contentLength: responseContent.length,\n })\n\n const containsYes = responseContent.toLowerCase().includes('yes')\n\n if (containsYes) {\n return {\n success: true,\n message: `\u2705 Connection test passed with ${endpointName}`,\n endpoint: endpointPath,\n details: `Model responded correctly: \\\"${responseContent.trim()}\\\"`,\n }\n }\n\n return {\n success: false,\n message: `\u26A0\uFE0F ${endpointName} connected but model response unexpected`,\n endpoint: endpointPath,\n details: `Expected \\\"YES\\\" but got: \\\"${responseContent.trim() || '(empty response)'}\\\"`,\n }\n }\n\n const errorData = (await response.json().catch(() => null)) as unknown\n const errorRecord = asRecord(errorData)\n const nestedErrorMessage = (() => {\n const nestedError = asRecord(errorRecord?.error)\n const nestedMessage = nestedError?.message\n return typeof nestedMessage === 'string' ? nestedMessage : null\n })()\n const errorMessage =\n nestedErrorMessage ||\n (typeof errorRecord?.message === 'string' ? errorRecord.message : null) ||\n response.statusText\n\n return {\n success: false,\n message: `\u274C ${endpointName} failed (${response.status})`,\n endpoint: endpointPath,\n details: `Error: ${errorMessage}`,\n }\n } catch (error) {\n return {\n success: false,\n message: `\u274C ${endpointName} connection failed`,\n endpoint: endpointPath,\n details: error instanceof Error ? error.message : String(error),\n }\n }\n}\n", "import { verifyApiKey } from '#core/ai/llmLazy'\nimport type { ProviderType } from '#core/utils/config'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport type { ConnectionTestResult } from './types'\n\nexport async function testProviderSpecificEndpoint({\n baseURL,\n selectedProvider,\n apiKey,\n}: {\n baseURL: string\n selectedProvider: ProviderType\n apiKey: string\n}): Promise<ConnectionTestResult> {\n if (selectedProvider === 'anthropic' || selectedProvider === 'bigdream') {\n try {\n debugLogger.api('PROVIDER_CONNECTION_TEST_NATIVE_SDK', {\n provider: selectedProvider,\n })\n\n let testBaseURL: string | undefined = undefined\n if (selectedProvider === 'bigdream') {\n testBaseURL = baseURL || 'https://api-key.info'\n } else if (selectedProvider === 'anthropic') {\n testBaseURL =\n baseURL && baseURL !== 'https://api.anthropic.com'\n ? baseURL\n : undefined\n }\n\n const isValid = await verifyApiKey(apiKey, testBaseURL, selectedProvider)\n\n if (isValid) {\n return {\n success: true,\n message: `\u2705 ${selectedProvider} connection test passed`,\n endpoint: '/messages',\n details: 'API key verified using native SDK',\n }\n }\n\n return {\n success: false,\n message: `\u274C ${selectedProvider} API key verification failed`,\n endpoint: '/messages',\n details: 'Invalid API key. Please check your API key and try again.',\n }\n } catch (error) {\n debugLogger.warn('PROVIDER_CONNECTION_TEST_NATIVE_SDK_ERROR', {\n provider: selectedProvider,\n error: error instanceof Error ? error.message : String(error),\n })\n return {\n success: false,\n message: `\u274C ${selectedProvider} connection failed`,\n endpoint: '/messages',\n details: error instanceof Error ? error.message : String(error),\n }\n }\n }\n\n return {\n success: true,\n message: `\u2705 Configuration saved for ${selectedProvider}`,\n details: 'Provider-specific testing not implemented yet',\n }\n}\n", "import { providers } from '#core/constants/models'\nimport { verifyApiKey } from '#core/ai/llmLazy'\nimport { testGPT5Connection, validateGPT5Config } from '#config/connectionTest'\nimport type { ProviderType } from '#core/utils/config'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { isOpenAICompatibleProvider } from './openAICompatibility'\nimport type { ConnectionTestParams, ConnectionTestResult } from './types'\nimport { testChatEndpoint } from './testChatEndpoint'\nimport { testProviderSpecificEndpoint } from './testProviderSpecificEndpoint'\n\nexport async function performConnectionTest({\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n providerBaseUrl,\n customBaseUrl,\n resourceName,\n}: ConnectionTestParams): Promise<ConnectionTestResult> {\n try {\n let testBaseURL =\n providerBaseUrl || providers[selectedProvider]?.baseURL || ''\n\n if (selectedProvider === 'azure') {\n testBaseURL = `https://${resourceName}.openai.azure.com/openai/deployments/${selectedModel}`\n } else if (selectedProvider === 'custom-openai') {\n testBaseURL = customBaseUrl\n }\n\n const isOpenAICompatible = isOpenAICompatibleProvider(selectedProvider)\n\n if (isOpenAICompatible) {\n const isGPT5 = selectedModel?.toLowerCase().includes('gpt-5')\n\n if (isGPT5) {\n debugLogger.api('GPT5_CONNECTION_TEST_USING_SPECIALIZED', {\n model: selectedModel,\n provider: selectedProvider,\n })\n\n const configValidation = validateGPT5Config({\n model: selectedModel,\n apiKey: apiKey,\n baseURL: testBaseURL,\n maxTokens: parseInt(maxTokens) || 8192,\n provider: selectedProvider,\n })\n\n if (!configValidation.valid) {\n return {\n success: false,\n message: '\u274C GPT-5 configuration validation failed',\n details: configValidation.errors.join('\\n'),\n }\n }\n\n return await testGPT5Connection({\n model: selectedModel,\n apiKey: apiKey,\n baseURL: testBaseURL,\n maxTokens: parseInt(maxTokens) || 8192,\n provider: selectedProvider,\n })\n }\n\n const endpointsToTry: Array<{ path: string; name: string }> = []\n\n if (selectedProvider === 'minimax') {\n endpointsToTry.push(\n { path: '/text/chatcompletion_v2', name: 'MiniMax v2 (recommended)' },\n { path: '/chat/completions', name: 'Standard OpenAI' },\n )\n } else {\n endpointsToTry.push({\n path: '/chat/completions',\n name: 'Standard OpenAI',\n })\n }\n\n let lastError: ConnectionTestResult | null = null\n for (const endpoint of endpointsToTry) {\n try {\n const testResult = await testChatEndpoint({\n baseURL: testBaseURL,\n endpointPath: endpoint.path,\n endpointName: endpoint.name,\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n })\n\n if (testResult.success) {\n return testResult\n }\n lastError = testResult\n } catch (error) {\n lastError = {\n success: false,\n message: `Failed to test ${endpoint.name}`,\n endpoint: endpoint.path,\n details: error instanceof Error ? error.message : String(error),\n }\n }\n }\n\n return (\n lastError || {\n success: false,\n message: 'All endpoints failed',\n details: 'No endpoints could be reached',\n }\n )\n }\n\n return await testProviderSpecificEndpoint({\n baseURL: testBaseURL,\n selectedProvider,\n apiKey,\n })\n } catch (error) {\n return {\n success: false,\n message: 'Connection test failed',\n details: error instanceof Error ? error.message : String(error),\n }\n }\n}\n", "import type { ConnectionTestParams, ConnectionTestResult } from './types'\nimport { performConnectionTest } from './performConnectionTest'\n\nexport async function runConnectionTestFlow({\n params,\n navigateTo,\n setTimeoutFn,\n performConnectionTestFn,\n}: {\n params: ConnectionTestParams\n navigateTo: (screen: 'confirmation') => void\n setTimeoutFn?: (callback: () => void, delayMs: number) => unknown\n performConnectionTestFn?: (\n params: ConnectionTestParams,\n ) => Promise<ConnectionTestResult>\n}): Promise<ConnectionTestResult> {\n const result = await (performConnectionTestFn ?? performConnectionTest)(\n params,\n )\n\n if (result.success) {\n const schedule =\n setTimeoutFn ?? ((callback, delayMs) => setTimeout(callback, delayMs))\n schedule(() => {\n navigateTo('confirmation')\n }, 2000)\n }\n\n return result\n}\n", "import type { ProviderType } from '#core/utils/config'\nimport { providers } from '#core/constants/models'\n\nimport type { ModelSelectorScreen } from '../state'\n\ntype Deps = {\n navigateTo: (screen: ModelSelectorScreen) => void\n setPartnerProviderFocusIndex: (idx: number) => void\n setCodingPlanFocusIndex: (idx: number) => void\n setSelectedProvider: (provider: ProviderType) => void\n setProviderBaseUrl: (baseUrl: string) => void\n saveConfiguration: (provider: ProviderType, model: string) => unknown\n onDone: () => void\n selectedModel: string\n}\n\nexport function handleProviderSelection(provider: string, deps: Deps) {\n const {\n navigateTo,\n setPartnerProviderFocusIndex,\n setCodingPlanFocusIndex,\n setSelectedProvider,\n setProviderBaseUrl,\n saveConfiguration,\n onDone,\n selectedModel,\n } = deps\n\n // Handle main menu navigation\n if (provider === 'partnerProviders') {\n setPartnerProviderFocusIndex(0)\n navigateTo('partnerProviders')\n return\n } else if (provider === 'partnerCodingPlans') {\n setCodingPlanFocusIndex(0)\n navigateTo('partnerCodingPlans')\n return\n } else if (provider === 'custom-anthropic') {\n // For custom Anthropic API, go to base URL screen\n setSelectedProvider('anthropic' as ProviderType)\n setProviderBaseUrl('')\n navigateTo('baseUrl')\n return\n }\n\n // Handle actual provider selection\n const providerType = provider as ProviderType\n setSelectedProvider(providerType)\n\n if (provider === 'custom') {\n // For custom provider, save and exit\n saveConfiguration(providerType, selectedModel || '')\n onDone()\n } else if (provider === 'custom-openai' || provider === 'ollama') {\n // For custom-openai and ollama, need to configure base URL\n const defaultBaseUrl = providers[providerType]?.baseURL || ''\n setProviderBaseUrl(defaultBaseUrl)\n navigateTo('baseUrl')\n } else {\n // For all standard partner providers, skip baseUrl and go directly to API key\n const defaultBaseUrl = providers[providerType]?.baseURL || ''\n setProviderBaseUrl(defaultBaseUrl)\n navigateTo('apiKey')\n }\n}\n", "import { providers } from '#core/constants/models'\nimport type { ModelPointerType, ProviderType } from '#core/utils/config'\nimport { setAllPointersToModel, setModelPointer } from '#core/utils/config'\nimport { getModelManager } from '#core/utils/model'\n\nimport { DEFAULT_CONTEXT_LENGTH, DEFAULT_MAX_TOKENS } from '../options'\n\ntype Params = {\n provider: ProviderType\n model: string\n providerBaseUrl: string\n resourceName: string\n customBaseUrl: string\n apiKey: string\n maxTokens: string\n contextLength: number\n reasoningEffort: any\n getModelManagerFn?: typeof getModelManager\n}\n\nexport async function saveModelConfiguration({\n provider,\n model,\n providerBaseUrl,\n resourceName,\n customBaseUrl,\n apiKey,\n maxTokens,\n contextLength,\n reasoningEffort,\n getModelManagerFn,\n}: Params): Promise<string> {\n let baseURL = providerBaseUrl || providers[provider]?.baseURL || ''\n let actualProvider = provider\n\n // For Anthropic provider, use defaults\n if (provider === 'anthropic') {\n actualProvider = 'anthropic'\n baseURL = baseURL || 'https://api.anthropic.com'\n }\n\n // For Azure, construct the baseURL using the resource name\n if (provider === 'azure') {\n baseURL = `https://${resourceName}.openai.azure.com/openai/deployments/${model}`\n }\n // For custom OpenAI-compatible API, use the custom base URL\n else if (provider === 'custom-openai') {\n baseURL = customBaseUrl\n }\n\n // Use ModelManager's addModel method for duplicate validation\n const modelManager = (getModelManagerFn ?? getModelManager)()\n\n // Generate a unique name for the model\n // If model is empty (for providers without model selection), use provider name\n const displayModel = model || 'default'\n const modelDisplayName =\n `${providers[actualProvider]?.name || actualProvider} ${displayModel}`.trim()\n\n const modelConfig = {\n name: modelDisplayName,\n provider: actualProvider,\n modelName: model || actualProvider, // Use provider name if no specific model\n baseURL: baseURL,\n apiKey: apiKey || '',\n maxTokens: parseInt(maxTokens) || DEFAULT_MAX_TOKENS,\n contextLength: contextLength || DEFAULT_CONTEXT_LENGTH,\n reasoningEffort,\n }\n\n // addModel method will throw error if duplicate exists\n return await modelManager.addModel(modelConfig)\n}\n\ntype ApplyPointersParams = {\n modelId: string\n isOnboarding: boolean\n targetPointer?: ModelPointerType\n setModelPointerFn?: typeof setModelPointer\n setAllPointersToModelFn?: typeof setAllPointersToModel\n}\n\nexport function applyPointersForNewModel({\n modelId,\n isOnboarding,\n targetPointer,\n setModelPointerFn,\n setAllPointersToModelFn,\n}: ApplyPointersParams) {\n const setModelPointerImpl = setModelPointerFn ?? setModelPointer\n const setAllPointersImpl = setAllPointersToModelFn ?? setAllPointersToModel\n\n // Always set the main model pointer to the newly added model\n // This ensures the user immediately starts using the model they just configured\n setModelPointerImpl('main', modelId)\n\n // Handle additional pointer assignments\n if (isOnboarding) {\n // First-time setup: set all pointers to this model\n setAllPointersImpl(modelId)\n } else if (targetPointer && targetPointer !== 'main') {\n // Specific pointer configuration: also set target pointer\n setModelPointerImpl(targetPointer, modelId)\n }\n}\n", "import OpenAI from 'openai'\n\nimport models, { providers } from '#core/constants/models'\nimport type { ProviderType } from '#core/utils/config'\n\nimport type { ModelInfo } from '../types'\n\ntype Params = {\n selectedProvider: ProviderType\n apiKey: string\n providerBaseUrl: string\n customBaseUrl: string\n modelFetchers: any\n setIsLoadingModels: (isLoading: boolean) => void\n setModelLoadError: (error: string | null) => void\n setAvailableModels: (models: ModelInfo[]) => void\n navigateTo: (screen: 'model' | 'modelInput') => void\n}\n\nexport async function fetchModelsForProvider({\n selectedProvider,\n apiKey,\n providerBaseUrl,\n customBaseUrl,\n modelFetchers,\n setIsLoadingModels,\n setModelLoadError,\n setAvailableModels,\n navigateTo,\n}: Params): Promise<ModelInfo[]> {\n setIsLoadingModels(true)\n setModelLoadError(null)\n\n try {\n // For Anthropic provider (including official and community proxies via sub-menu), use the same logic\n if (selectedProvider === 'anthropic') {\n const anthropicModels =\n await modelFetchers.fetchAnthropicCompatibleProviderModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(anthropicModels)\n navigateTo('model')\n return anthropicModels\n }\n\n // For custom OpenAI-compatible APIs, use the fetchCustomOpenAIModels function\n if (selectedProvider === 'custom-openai') {\n const customModels = await modelFetchers.fetchCustomOpenAIModels({\n apiKey,\n customBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(customModels)\n navigateTo('model')\n return customModels\n }\n\n // For Gemini, use the separate fetchGeminiModels function\n if (selectedProvider === 'gemini') {\n const geminiModels = await modelFetchers.fetchGeminiModels({\n apiKey,\n setModelLoadError,\n })\n setAvailableModels(geminiModels)\n navigateTo('model')\n return geminiModels\n }\n\n // For Kimi, use the fetchKimiModels function\n if (selectedProvider === 'kimi') {\n const kimiModels = await modelFetchers.fetchKimiModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(kimiModels)\n navigateTo('model')\n return kimiModels\n }\n\n // For DeepSeek, use the fetchDeepSeekModels function\n if (selectedProvider === 'deepseek') {\n const deepseekModels = await modelFetchers.fetchDeepSeekModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(deepseekModels)\n navigateTo('model')\n return deepseekModels\n }\n\n // For SiliconFlow, use the fetchSiliconFlowModels function\n if (selectedProvider === 'siliconflow') {\n const siliconflowModels = await modelFetchers.fetchSiliconFlowModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(siliconflowModels)\n navigateTo('model')\n return siliconflowModels\n }\n\n // For Qwen, use the fetchQwenModels function\n if (selectedProvider === 'qwen') {\n const qwenModels = await modelFetchers.fetchQwenModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(qwenModels)\n navigateTo('model')\n return qwenModels\n }\n\n // For GLM, use the fetchGLMModels function\n if (selectedProvider === 'glm') {\n const glmModels = await modelFetchers.fetchGLMModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(glmModels)\n navigateTo('model')\n return glmModels\n }\n\n // For Baidu Qianfan, use the fetchBaiduQianfanModels function\n if (selectedProvider === 'baidu-qianfan') {\n const baiduModels = await modelFetchers.fetchBaiduQianfanModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(baiduModels)\n navigateTo('model')\n return baiduModels\n }\n\n // For Azure, skip model fetching and go directly to model input\n if (selectedProvider === 'azure') {\n navigateTo('modelInput')\n return []\n }\n\n // For all other providers, use the OpenAI client\n let baseURL = providerBaseUrl || providers[selectedProvider]?.baseURL\n\n // For custom-openai provider, use the custom base URL\n if (selectedProvider === 'custom-openai') {\n baseURL = customBaseUrl\n }\n\n const openai = new OpenAI({\n apiKey: apiKey || 'dummy-key-for-ollama', // Ollama doesn't need a real key\n baseURL: baseURL,\n dangerouslyAllowBrowser: true,\n })\n\n // Fetch the models\n const response = await openai.models.list()\n\n // Transform the response into our ModelInfo format\n const fetchedModels = []\n for (const model of response.data) {\n const record = model as unknown as Record<string, unknown>\n const modelName =\n (typeof record.modelName === 'string' && record.modelName) ||\n (typeof record.id === 'string' && record.id) ||\n (typeof record.name === 'string' && record.name) ||\n (typeof record.model === 'string' && record.model) ||\n 'unknown'\n const modelInfo = models[selectedProvider as keyof typeof models]?.find(\n m => m.model === modelName,\n )\n fetchedModels.push({\n model: modelName,\n provider: selectedProvider,\n max_tokens: modelInfo?.max_output_tokens,\n supports_vision: modelInfo?.supports_vision || false,\n supports_function_calling:\n modelInfo?.supports_function_calling || false,\n supports_reasoning_effort:\n modelInfo?.supports_reasoning_effort || false,\n })\n }\n\n setAvailableModels(fetchedModels)\n\n // Navigate to model selection screen if models were loaded successfully\n navigateTo('model')\n\n return fetchedModels\n } catch (error) {\n // Log for debugging\n console.error('Error fetching models:', error)\n\n // Re-throw the error so that fetchModelsWithRetry can handle it properly\n throw error\n } finally {\n setIsLoadingModels(false)\n }\n}\n", "export { fetchAnthropicCompatibleProviderModels } from './modelFetchers/anthropic'\nexport { fetchBaiduQianfanModels } from './modelFetchers/baiduQianfan'\nexport { fetchCustomOpenAIModels } from './modelFetchers/customOpenAI'\nexport { fetchDeepSeekModels } from './modelFetchers/deepseek'\nexport { fetchGeminiModels } from './modelFetchers/gemini'\nexport { fetchGLMModels } from './modelFetchers/glm'\nexport { fetchKimiModels } from './modelFetchers/kimi'\nexport { fetchMinimaxModels } from './modelFetchers/minimax'\nexport { fetchQwenModels } from './modelFetchers/qwen'\nexport { fetchSiliconFlowModels } from './modelFetchers/siliconflow'\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nasync function fetchAnthropicModels(baseURL: string, apiKey: string) {\n try {\n const response = await fetch(`${baseURL}/v1/models`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\n 'Invalid API key. Please check your API key and try again.',\n )\n } else if (response.status === 403) {\n throw new Error('API key does not have permission to access models.')\n } else if (response.status === 404) {\n throw new Error(\n 'API endpoint not found. This provider may not support model listing.',\n )\n } else if (response.status === 429) {\n throw new Error(\n 'Too many requests. Please wait a moment and try again.',\n )\n } else if (response.status >= 500) {\n throw new Error(\n 'API service is temporarily unavailable. Please try again later.',\n )\n } else {\n throw new Error(`Unable to connect to API (${response.status}).`)\n }\n }\n\n const data = await response.json()\n\n let models = []\n if (data && data.data && Array.isArray(data.data)) {\n models = data.data\n } else if (Array.isArray(data)) {\n models = data\n } else if (data && data.models && Array.isArray(data.models)) {\n models = data.models\n } else {\n throw new Error('API returned unexpected response format.')\n }\n\n return models\n } catch (error) {\n if (\n error instanceof Error &&\n (error.message.includes('API key') ||\n error.message.includes('API endpoint') ||\n error.message.includes('API service') ||\n error.message.includes('response format'))\n ) {\n throw error\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new Error(\n 'Unable to connect to the API. Please check the base URL and your internet connection.',\n )\n }\n\n throw new Error(\n 'Failed to fetch models from API. Please check your configuration and try again.',\n )\n }\n}\n\n// \u901A\u7528\u7684Anthropic\u517C\u5BB9\u6A21\u578B\u83B7\u53D6\u51FD\u6570\uFF0C\u5B9E\u73B0\u4E09\u5C42\u964D\u7EA7\u7B56\u7565\nasync function fetchAnthropicCompatibleModelsWithFallback({\n baseURL,\n provider,\n apiKey,\n apiKeyUrl,\n setModelLoadError,\n}: {\n baseURL: string\n provider: string\n apiKey: string\n apiKeyUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n let lastError: Error | null = null\n\n // \u7B2C\u4E00\u5C42\uFF1A\u5C1D\u8BD5\u4F7F\u7528 Anthropic \u98CE\u683C\u7684 API\n try {\n const models = await fetchAnthropicModels(baseURL, apiKey)\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: provider,\n max_tokens: model.max_tokens || 8192,\n supports_vision: model.supports_vision || true,\n supports_function_calling: model.supports_function_calling || true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n lastError = error as Error\n debugLogger.warn('MODEL_FETCH_NATIVE_API_FAILED', {\n provider,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n\n // \u7B2C\u4E8C\u5C42\uFF1A\u5C1D\u8BD5\u4F7F\u7528 OpenAI \u98CE\u683C\u7684 API\n try {\n const models = await fetchCustomModels(baseURL, apiKey)\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: provider,\n max_tokens: model.max_tokens || 8192,\n supports_vision: model.supports_vision || false,\n supports_function_calling: model.supports_function_calling || true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n lastError = error as Error\n debugLogger.warn('MODEL_FETCH_OPENAI_API_FAILED', {\n provider,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n\n // \u7B2C\u4E09\u5C42\uFF1A\u964D\u7EA7\u5230\u624B\u52A8\u8F93\u5165\u6A21\u5F0F\n let errorMessage = `Failed to fetch ${provider} models using both native and OpenAI-compatible API formats`\n if (lastError instanceof Error) {\n errorMessage = lastError.message\n }\n\n // \u6DFB\u52A0\u6709\u7528\u7684\u5EFA\u8BAE\n if (errorMessage.includes('API key')) {\n errorMessage += apiKeyUrl\n ? `\\n\\n\uD83D\uDCA1 Tip: Get your API key from ${apiKeyUrl}`\n : '\\n\\n\uD83D\uDCA1 Tip: Check that your API key is set and valid for this provider'\n } else if (errorMessage.includes('permission')) {\n errorMessage += `\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the ${provider} API`\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw new Error(errorMessage)\n}\n\nexport async function fetchAnthropicCompatibleProviderModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n // For anthropic, use defaults\n const defaultBaseURL = 'https://api.anthropic.com'\n const apiKeyUrl = ''\n const actualProvider = 'anthropic'\n const baseURL = providerBaseUrl || defaultBaseURL\n return fetchAnthropicCompatibleModelsWithFallback({\n baseURL,\n provider: actualProvider,\n apiKey,\n apiKeyUrl,\n setModelLoadError,\n })\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchBaiduQianfanModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://qianfan.baidubce.com/v2'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'baidu-qianfan',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch Baidu Qianfan models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://console.bce.baidu.com/iam/#/iam/accesslist'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Baidu Qianfan API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchCustomOpenAIModels({\n apiKey,\n customBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n customBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const models = await fetchCustomModels(customBaseUrl, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'custom-openai',\n max_tokens: model.max_tokens || 4096,\n supports_vision: false, // Default to false, could be enhanced\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch custom API models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n // Add helpful suggestions based on error type\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Check that your API key is valid for this endpoint'\n } else if (errorMessage.includes('endpoint not found')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure the base URL ends with /v1 and supports OpenAI-compatible API'\n } else if (errorMessage.includes('connect')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Verify the base URL is correct and accessible'\n } else if (errorMessage.includes('response format')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: This API may not be fully OpenAI-compatible'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchDeepSeekModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://api.deepseek.com'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'deepseek',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false, // Default to false, could be enhanced\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch DeepSeek models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n // Add helpful suggestions based on error type\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://platform.deepseek.com/api_keys'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the DeepSeek API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchGeminiModels({\n apiKey,\n setModelLoadError,\n}: {\n apiKey: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`,\n )\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(\n errorData.error?.message || `API error: ${response.status}`,\n )\n }\n\n const { models } = await response.json()\n\n return models\n .filter((model: any) =>\n model.supportedGenerationMethods.includes('generateContent'),\n )\n .map((model: any) => ({\n model: model.name.replace('models/', ''),\n provider: 'gemini',\n max_tokens: model.outputTokenLimit,\n supports_vision:\n model.supportedGenerationMethods.includes('generateContent'),\n supports_function_calling:\n model.supportedGenerationMethods.includes('generateContent'),\n }))\n } catch (error) {\n setModelLoadError(error instanceof Error ? error.message : 'Unknown error')\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchGLMModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://open.bigmodel.cn/api/paas/v4'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'glm',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch GLM models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://open.bigmodel.cn (API Keys section)'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the GLM API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchKimiModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://api.moonshot.cn/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'kimi',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false, // Default to false, could be enhanced\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch Kimi models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n // Add helpful suggestions based on error type\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://platform.moonshot.cn/console/api-keys'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Kimi API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchMinimaxModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://api.minimaxi.com/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'minimax',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch MiniMax models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://www.minimax.io/platform/user-center/basic-information'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the MiniMax API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchQwenModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL =\n providerBaseUrl || 'https://dashscope.aliyuncs.com/compatible-mode/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'qwen',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch Qwen models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://bailian.console.aliyun.com/?tab=model#/api-key'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Qwen API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchSiliconFlowModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://api.siliconflow.cn/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'siliconflow',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false, // Default to false, could be enhanced\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch SiliconFlow models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n // Add helpful suggestions based on error type\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://cloud.siliconflow.cn/i/oJWsm6io'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the SiliconFlow API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { DEFAULT_MAX_TOKENS } from '#ui-ink/ui/components/model-selector/options'\nimport type { ModelInfo } from '#ui-ink/ui/components/model-selector/types'\n\ntype JsonObject = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction getNestedValue(value: unknown, path: string[]): unknown {\n let current: unknown = value\n for (const key of path) {\n if (!isRecord(current)) return undefined\n current = current[key]\n }\n return current\n}\n\nfunction toPositiveFiniteNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value > 0\n ? value\n : null\n}\n\nexport async function fetchOllamaModels(args: {\n ollamaBaseUrl: string\n setAvailableModels: (models: ModelInfo[]) => void\n setModelLoadError: (error: string | null) => void\n navigateTo: (screen: 'model') => void\n}): Promise<ModelInfo[]> {\n try {\n const response = await fetch(`${args.ollamaBaseUrl}/models`)\n\n if (!response.ok) {\n throw new Error(`HTTP error ${response.status}: ${response.statusText}`)\n }\n\n const responseData = await response.json()\n\n let models: unknown[] = []\n\n if (isRecord(responseData) && Array.isArray(responseData.data)) {\n models = responseData.data\n } else if (isRecord(responseData) && Array.isArray(responseData.models)) {\n models = responseData.models\n } else if (Array.isArray(responseData)) {\n models = responseData\n } else {\n throw new Error('Invalid response from Ollama API: missing models array')\n }\n\n const getModelName = (model: unknown): string => {\n if (typeof model === 'string') return model\n if (!isRecord(model)) return ''\n\n const candidates = [\n model.id,\n model.name,\n model.modelName,\n model.model,\n model.model_name,\n ]\n for (const c of candidates) {\n if (typeof c === 'string') return c\n }\n return ''\n }\n\n const ollamaModels: ModelInfo[] = models.map(model => ({\n model: getModelName(model),\n provider: 'ollama',\n max_tokens: DEFAULT_MAX_TOKENS,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n\n const validModels = ollamaModels.filter(model => model.model)\n\n const normalizeOllamaRoot = (url: string): string => {\n try {\n const u = new URL(url)\n let pathname = u.pathname.replace(/\\/+$/g, '').replace(/^$/, '')\n if (pathname.endsWith('/v1')) {\n pathname = pathname.slice(0, -3)\n }\n u.pathname = pathname\n return u.toString().replace(/\\/+$/g, '')\n } catch {\n return url.replace(/\\/v1\\/?$/g, '')\n }\n }\n\n const extractContextTokens = (data: unknown): number | null => {\n if (!isRecord(data)) return null\n\n const modelInfoValue = data.model_info\n if (isRecord(modelInfoValue)) {\n for (const key of Object.keys(modelInfoValue)) {\n if (\n key.endsWith('.context_length') ||\n key.endsWith('_context_length')\n ) {\n const val = toPositiveFiniteNumber(modelInfoValue[key])\n if (val) return val\n }\n }\n }\n\n const paths: string[][] = [\n ['parameters', 'num_ctx'],\n ['model_info', 'num_ctx'],\n ['config', 'num_ctx'],\n ['details', 'context_length'],\n ['context_length'],\n ['num_ctx'],\n ['max_tokens'],\n ['max_new_tokens'],\n ]\n\n const candidates = paths\n .map(path => toPositiveFiniteNumber(getNestedValue(data, path)))\n .filter((v): v is number => typeof v === 'number')\n\n if (candidates.length > 0) return Math.max(...candidates)\n\n const parametersValue = getNestedValue(data, ['parameters'])\n if (typeof parametersValue === 'string') {\n const m = parametersValue.match(/num_ctx\\s*[:=]\\s*(\\d+)/i)\n if (!m) return null\n const n = parseInt(m[1], 10)\n return Number.isFinite(n) && n > 0 ? n : null\n }\n return null\n }\n\n const ollamaRoot = normalizeOllamaRoot(args.ollamaBaseUrl)\n const enrichedModels = await Promise.all(\n validModels.map(async m => {\n try {\n const showResp = await fetch(`${ollamaRoot}/api/show`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name: m.model }),\n })\n if (showResp.ok) {\n const showData = await showResp.json()\n const ctx = extractContextTokens(showData)\n if (typeof ctx === 'number' && isFinite(ctx) && ctx > 0) {\n return { ...m, context_length: ctx }\n }\n }\n return m\n } catch {\n return m\n }\n }),\n )\n\n args.setAvailableModels(enrichedModels)\n\n if (enrichedModels.length > 0) {\n args.navigateTo('model')\n } else {\n args.setModelLoadError('No models found in your Ollama installation')\n }\n\n return enrichedModels\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n if (errorMessage.includes('fetch')) {\n args.setModelLoadError(\n `Could not connect to Ollama server at ${args.ollamaBaseUrl}. Make sure Ollama is running and the URL is correct.`,\n )\n } else {\n args.setModelLoadError(`Error loading Ollama models: ${errorMessage}`)\n }\n\n console.error('Error fetching Ollama models:', error)\n return []\n }\n}\n", "import { debug as debugLogger } from '#core/utils/debugLogger'\nimport { fetchModelsForProvider } from '#ui-ink/ui/components/model-selector/actions/fetchModels'\nimport {\n CONTEXT_LENGTH_OPTIONS,\n DEFAULT_CONTEXT_LENGTH,\n DEFAULT_MAX_TOKENS,\n MAX_TOKENS_OPTIONS,\n REASONING_EFFORT_OPTIONS,\n} from '#ui-ink/ui/components/model-selector/options'\nimport type { ModelInfo } from '#ui-ink/ui/components/model-selector/types'\nimport * as modelFetchers from '#ui-ink/ui/components/model-selector/modelFetchers'\nimport { fetchOllamaModels } from './fetchOllamaModels'\nimport type { ModelSelectorState } from './useModelSelectorState'\nimport type { ModelParamsField } from './viewTypes'\n\nexport function useModelSelectorModelFlow(state: ModelSelectorState) {\n async function fetchModels(): Promise<ModelInfo[]> {\n return await fetchModelsForProvider({\n selectedProvider: state.selectedProvider,\n apiKey: state.apiKey,\n providerBaseUrl: state.providerBaseUrl,\n customBaseUrl: state.customBaseUrl,\n modelFetchers,\n setIsLoadingModels: state.setIsLoadingModels,\n setModelLoadError: state.setModelLoadError,\n setAvailableModels: state.setAvailableModels,\n navigateTo: state.navigateTo,\n })\n }\n\n async function fetchModelsWithRetry(): Promise<ModelInfo[]> {\n const MAX_RETRIES = 2\n let lastError: Error | null = null\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n state.setFetchRetryCount(attempt)\n state.setIsRetrying(attempt > 1)\n\n if (attempt > 1) {\n state.setModelLoadError(\n `Attempt ${attempt}/${MAX_RETRIES}: Retrying model discovery...`,\n )\n await new Promise(resolve => setTimeout(resolve, 1000))\n }\n\n try {\n const models = await fetchModels()\n state.setFetchRetryCount(0)\n state.setIsRetrying(false)\n state.setModelLoadError(null)\n return models\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n debugLogger.warn('MODEL_FETCH_RETRY_FAILED', {\n attempt,\n maxRetries: MAX_RETRIES,\n error: lastError.message,\n provider: state.selectedProvider,\n })\n\n if (attempt === MAX_RETRIES) break\n }\n }\n\n state.setIsRetrying(false)\n const errorMessage = lastError?.message || 'Unknown error'\n\n state.setModelLoadError(\n `Failed to validate API key after ${MAX_RETRIES} attempts: ${errorMessage}\\n\\nPlease check your API key and try again, or press Tab to manually enter model name.`,\n )\n throw new Error(`API key validation failed: ${errorMessage}`)\n }\n\n async function handleApiKeySubmit(key: string) {\n const cleanedKey = key.replace(/[\\r\\n]/g, '').trim()\n state.setApiKey(cleanedKey)\n state.setModelLoadError(null)\n\n if (state.selectedProvider === 'azure') {\n state.navigateTo('resourceName')\n return\n }\n\n try {\n state.setIsLoadingModels(true)\n const models = await fetchModelsWithRetry()\n if (models.length === 0) {\n state.navigateTo('modelInput')\n }\n } catch (error) {\n console.error('API key validation failed:', error)\n } finally {\n state.setIsLoadingModels(false)\n }\n }\n\n function handleResourceNameSubmit(name: string) {\n state.setResourceName(name)\n state.navigateTo('modelInput')\n }\n\n function handleCustomBaseUrlSubmit(url: string) {\n const cleanUrl = url.replace(/\\/+$/, '')\n state.setCustomBaseUrl(cleanUrl)\n state.navigateTo('apiKey')\n }\n\n function handleProviderBaseUrlSubmit(url: string) {\n const cleanUrl = url.replace(/\\/+$/, '')\n state.setProviderBaseUrl(cleanUrl)\n\n if (state.selectedProvider === 'ollama') {\n state.setOllamaBaseUrl(cleanUrl)\n state.setIsLoadingModels(true)\n state.setModelLoadError(null)\n\n fetchOllamaModels({\n ollamaBaseUrl: cleanUrl,\n setAvailableModels: state.setAvailableModels,\n setModelLoadError: state.setModelLoadError,\n navigateTo: () => state.navigateTo('model'),\n }).finally(() => {\n state.setIsLoadingModels(false)\n })\n } else {\n state.navigateTo('apiKey')\n }\n }\n\n function handleCustomModelSubmit(model: string) {\n state.setCustomModelName(model)\n state.setSelectedModel(model)\n state.setSupportsReasoningEffort(false)\n state.setReasoningEffort(null)\n\n state.setMaxTokensMode('preset')\n state.setSelectedMaxTokensPreset(DEFAULT_MAX_TOKENS)\n state.setMaxTokens(DEFAULT_MAX_TOKENS.toString())\n state.setMaxTokensCursorOffset(DEFAULT_MAX_TOKENS.toString().length)\n\n state.navigateTo('modelParams')\n state.setActiveFieldIndex(0)\n }\n\n function handleModelSelection(model: string) {\n state.setSelectedModel(model)\n\n const modelInfo = state.availableModels.find(m => m.model === model)\n state.setSupportsReasoningEffort(\n Boolean(modelInfo?.supports_reasoning_effort),\n )\n\n if (!modelInfo?.supports_reasoning_effort) {\n state.setReasoningEffort(null)\n }\n\n state.setContextLength(modelInfo?.context_length ?? DEFAULT_CONTEXT_LENGTH)\n\n const modelMaxTokens = modelInfo?.max_tokens\n if (typeof modelMaxTokens === 'number' && Number.isFinite(modelMaxTokens)) {\n const matchingPreset = MAX_TOKENS_OPTIONS.find(\n option => option.value === modelMaxTokens,\n )\n\n if (matchingPreset) {\n state.setMaxTokensMode('preset')\n state.setSelectedMaxTokensPreset(modelMaxTokens)\n state.setMaxTokens(modelMaxTokens.toString())\n } else {\n state.setMaxTokensMode('custom')\n state.setMaxTokens(modelMaxTokens.toString())\n }\n state.setMaxTokensCursorOffset(modelMaxTokens.toString().length)\n } else {\n state.setMaxTokensMode('preset')\n state.setSelectedMaxTokensPreset(DEFAULT_MAX_TOKENS)\n state.setMaxTokens(DEFAULT_MAX_TOKENS.toString())\n state.setMaxTokensCursorOffset(DEFAULT_MAX_TOKENS.toString().length)\n }\n\n state.navigateTo('modelParams')\n state.setActiveFieldIndex(0)\n }\n\n const handleModelParamsSubmit = () => {\n if (\n !CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === state.contextLength)\n ) {\n state.setContextLength(DEFAULT_CONTEXT_LENGTH)\n }\n state.navigateTo('contextLength')\n }\n\n const getFormFieldsForModelParams = (): ModelParamsField[] => {\n const fields: ModelParamsField[] = [\n {\n name: 'maxTokens',\n label: 'Maximum Tokens',\n description: 'Select the maximum number of tokens to generate.',\n component: 'select',\n options: MAX_TOKENS_OPTIONS.map(option => ({\n label: option.label,\n value: option.value.toString(),\n })),\n defaultValue: state.maxTokens,\n },\n ]\n\n if (state.supportsReasoningEffort) {\n fields.push({\n name: 'reasoningEffort',\n label: 'Reasoning Effort',\n description: 'Controls reasoning depth for complex problems.',\n component: 'select',\n })\n }\n\n fields.push({ name: 'submit', label: 'Continue \u2192', component: 'button' })\n return fields\n }\n\n const reasoningEffortOptions = REASONING_EFFORT_OPTIONS\n const handleContextLengthSubmit = () => state.navigateTo('connectionTest')\n\n return {\n fetchModelsWithRetry,\n handleApiKeySubmit,\n handleResourceNameSubmit,\n handleCustomBaseUrlSubmit,\n handleProviderBaseUrlSubmit,\n handleCustomModelSubmit,\n handleModelSelection,\n handleModelParamsSubmit,\n getFormFieldsForModelParams,\n reasoningEffortOptions,\n handleContextLengthSubmit,\n }\n}\n\nexport type ModelSelectorModelFlow = ReturnType<\n typeof useModelSelectorModelFlow\n>\n", "import type { ModelSelectorState } from './useModelSelectorState'\n\nexport function useModelSelectorTextHandlers(state: ModelSelectorState) {\n function handleCursorOffsetChange(offset: number) {\n state.setCursorOffset(offset)\n }\n\n function formatApiKeyDisplay(key: string): string {\n if (!key) return ''\n if (key.length <= 10) return '*'.repeat(key.length)\n\n const prefix = key.slice(0, 4)\n const suffix = key.slice(-4)\n const middleLength = Math.max(0, key.length - 8)\n const middle = '*'.repeat(Math.min(middleLength, 30))\n return `${prefix}${middle}${suffix}`\n }\n\n function handleApiKeyChange(value: string) {\n state.setApiKeyEdited(true)\n const cleanedValue = value.replace(/[\\\\r\\\\n]/g, '').trim()\n\n if (value !== cleanedValue && value.length > 0) {\n state.setApiKeyCleanedNotification(true)\n setTimeout(() => state.setApiKeyCleanedNotification(false), 3000)\n }\n\n state.setApiKey(cleanedValue)\n state.setCursorOffset(cleanedValue.length)\n }\n\n function handleModelSearchChange(value: string) {\n state.setModelSearchQuery(value)\n state.setModelSearchCursorOffset(value.length)\n }\n\n function handleModelSearchCursorOffsetChange(offset: number) {\n state.setModelSearchCursorOffset(offset)\n }\n\n return {\n handleCursorOffsetChange,\n formatApiKeyDisplay,\n handleApiKeyChange,\n handleModelSearchChange,\n handleModelSearchCursorOffsetChange,\n }\n}\n\nexport type ModelSelectorTextHandlers = ReturnType<\n typeof useModelSelectorTextHandlers\n>\n", "import type { ProviderType } from '#core/utils/config'\nimport { runConnectionTestFlow } from '#ui-ink/ui/components/model-selector/actions/connectionTest'\nimport { handleProviderSelection as handleProviderSelectionAction } from '#ui-ink/ui/components/model-selector/actions/providerSelection'\nimport {\n applyPointersForNewModel,\n saveModelConfiguration,\n} from '#ui-ink/ui/components/model-selector/actions/saveConfiguration'\nimport { handleBackNavigation } from '#ui-ink/ui/components/model-selector/state'\nimport type { ModelSelectorProps } from './types'\nimport type { ModelSelectorState } from './useModelSelectorState'\nimport { useModelSelectorModelFlow } from './useModelSelectorModelFlow'\nimport { useModelSelectorTextHandlers } from './useModelSelectorTextHandlers'\n\ntype Args = {\n props: ModelSelectorProps\n state: ModelSelectorState\n onDone: () => void\n}\n\nexport function useModelSelectorActions({ props, state, onDone }: Args) {\n const modelFlow = useModelSelectorModelFlow(state)\n const textHandlers = useModelSelectorTextHandlers(state)\n\n async function saveConfiguration(\n provider: ProviderType,\n model: string,\n ): Promise<string | null> {\n try {\n return await saveModelConfiguration({\n provider,\n model,\n providerBaseUrl: state.providerBaseUrl,\n resourceName: state.resourceName,\n customBaseUrl: state.customBaseUrl,\n apiKey: state.apiKey,\n maxTokens: state.maxTokens,\n contextLength: state.contextLength,\n reasoningEffort: state.reasoningEffort ?? undefined,\n })\n } catch (error) {\n state.setValidationError(\n error instanceof Error ? error.message : 'Failed to add model',\n )\n return null\n }\n }\n\n async function handleConfirmation(): Promise<void> {\n state.setValidationError(null)\n const modelId = await saveConfiguration(\n state.selectedProvider,\n state.selectedModel,\n )\n if (!modelId) return\n\n applyPointersForNewModel({\n modelId,\n isOnboarding: Boolean(props.isOnboarding),\n targetPointer: props.targetPointer,\n })\n\n onDone()\n }\n\n const handleBack = () => {\n const { stack: nextStack, effect } = handleBackNavigation(state.screenStack)\n\n if (effect?.type === 'resetProviderFocus') {\n state.setProviderFocusIndex(0)\n }\n\n if (effect?.type === 'exit') {\n if (props.onCancel) props.onCancel()\n else onDone()\n return\n }\n\n if (nextStack !== state.screenStack) {\n state.setScreenStack(nextStack)\n }\n }\n\n function handleProviderSelection(provider: string) {\n handleProviderSelectionAction(provider, {\n navigateTo: state.navigateTo,\n setPartnerProviderFocusIndex: state.setPartnerProviderFocusIndex,\n setCodingPlanFocusIndex: state.setCodingPlanFocusIndex,\n setSelectedProvider: state.setSelectedProvider,\n setProviderBaseUrl: state.setProviderBaseUrl,\n saveConfiguration,\n onDone,\n selectedModel: state.selectedModel,\n })\n }\n\n async function handleConnectionTest() {\n state.setIsTestingConnection(true)\n state.setConnectionTestResult(null)\n\n try {\n const result = await runConnectionTestFlow({\n params: {\n selectedProvider: state.selectedProvider,\n selectedModel: state.selectedModel,\n apiKey: state.apiKey,\n maxTokens: state.maxTokens,\n providerBaseUrl: state.providerBaseUrl,\n customBaseUrl: state.customBaseUrl,\n resourceName: state.resourceName,\n },\n navigateTo: () => state.navigateTo('confirmation'),\n })\n state.setConnectionTestResult(result)\n } finally {\n state.setIsTestingConnection(false)\n }\n }\n\n return {\n handleBack,\n handleProviderSelection,\n ...modelFlow,\n handleConnectionTest,\n handleConfirmation,\n ...textHandlers,\n }\n}\n\nexport type ModelSelectorActions = ReturnType<typeof useModelSelectorActions>\n", "import { useRef } from 'react'\nimport { useInput } from 'ink'\n\nexport function useEscapeNavigation(\n onEscape: () => void,\n _abortController?: AbortController,\n) {\n const handledRef = useRef(false)\n\n useInput(\n (_input, key) => {\n if (key.escape && !handledRef.current) {\n handledRef.current = true\n setTimeout(() => {\n handledRef.current = false\n }, 100)\n onEscape()\n }\n },\n { isActive: true },\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useState", "Box", "Newline", "Text", "useInput", "Box", "Text", "React", "Box", "Text", "code", "type", "line", "React", "React", "Box", "Text", "React", "Box", "Text", "React", "Text", "useInput", "useState", "line", "useState", "React", "React", "React", "useInput", "Text", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "Newline", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "Text", "Box", "useEffect", "useMemo", "chalk", "chalk", "useInput", "useInput", "useMemo", "useMemo", "useMemo", "useMemo", "useState", "useState", "handleProviderSelection", "useRef", "useInput", "useMemo", "useEffect", "useState", "useInput", "React", "Box", "Text", "Newline"]
7
+ }