newcraw 1.0.2 → 1.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 (220) hide show
  1. package/dist/REPL-CTTH53A7.js +50 -0
  2. package/dist/{acp-J4WDYGRX.js → acp-25PIN25O.js} +69 -40
  3. package/dist/acp-25PIN25O.js.map +7 -0
  4. package/dist/{agentsValidate-UBOER2IN.js → agentsValidate-BXDD54YP.js} +13 -10
  5. package/dist/{agentsValidate-UBOER2IN.js.map → agentsValidate-BXDD54YP.js.map} +1 -1
  6. package/dist/{ask-MGUO3L35.js → ask-EL4XAA5P.js} +62 -52
  7. package/dist/ask-EL4XAA5P.js.map +7 -0
  8. package/dist/{autoUpdater-2GS6LRPK.js → autoUpdater-DKMSJXWW.js} +5 -4
  9. package/dist/{chunk-2C43OXE7.js → chunk-2OVXJBJV.js} +38 -59
  10. package/dist/chunk-2OVXJBJV.js.map +7 -0
  11. package/dist/{chunk-53A4JHFW.js → chunk-3D3C7MRI.js} +23 -4
  12. package/dist/chunk-3D3C7MRI.js.map +7 -0
  13. package/dist/{chunk-VKI7ORIO.js → chunk-3ZQRACCP.js} +37 -18
  14. package/dist/{chunk-VKI7ORIO.js.map → chunk-3ZQRACCP.js.map} +1 -1
  15. package/dist/chunk-4A6CDBDH.js +822 -0
  16. package/dist/chunk-4A6CDBDH.js.map +7 -0
  17. package/dist/{chunk-VQSCECTS.js → chunk-53VETVCP.js} +6 -4
  18. package/dist/{chunk-VQSCECTS.js.map → chunk-53VETVCP.js.map} +1 -1
  19. package/dist/{chunk-WWDVA4NV.js → chunk-6WT3ZRYF.js} +22 -6
  20. package/dist/{chunk-WWDVA4NV.js.map → chunk-6WT3ZRYF.js.map} +1 -1
  21. package/dist/{chunk-RUXIBQ3B.js → chunk-7E2L7EH2.js} +4 -4
  22. package/dist/{chunk-VHS2MZQS.js → chunk-7PWVUHQ2.js} +9 -6
  23. package/dist/{chunk-VHS2MZQS.js.map → chunk-7PWVUHQ2.js.map} +1 -1
  24. package/dist/{chunk-2EFL22PV.js → chunk-ADJ4YEII.js} +7 -3
  25. package/dist/chunk-ADJ4YEII.js.map +7 -0
  26. package/dist/chunk-AKNZJBBU.js +372 -0
  27. package/dist/chunk-AKNZJBBU.js.map +7 -0
  28. package/dist/chunk-ALQSPHXV.js +135 -0
  29. package/dist/chunk-ALQSPHXV.js.map +7 -0
  30. package/dist/{chunk-XS6PU75S.js → chunk-APSIF3YK.js} +1 -1
  31. package/dist/{chunk-IM33F5CM.js → chunk-BMJ5XGFR.js} +1668 -1623
  32. package/dist/chunk-BMJ5XGFR.js.map +7 -0
  33. package/dist/chunk-BQCOSNM3.js +93 -0
  34. package/dist/chunk-BQCOSNM3.js.map +7 -0
  35. package/dist/{chunk-OJIMOLIC.js → chunk-BTCASL4X.js} +3621 -7413
  36. package/dist/chunk-BTCASL4X.js.map +7 -0
  37. package/dist/chunk-CHB5K4GI.js +107 -0
  38. package/dist/chunk-CHB5K4GI.js.map +7 -0
  39. package/dist/{chunk-QH2M65BR.js → chunk-D2FSAFMO.js} +7 -3
  40. package/dist/{chunk-QH2M65BR.js.map → chunk-D2FSAFMO.js.map} +1 -1
  41. package/dist/chunk-D4OZACS2.js +35 -0
  42. package/dist/{chunk-IIFUDVGS.js → chunk-ENLHVQCX.js} +310 -177
  43. package/dist/chunk-ENLHVQCX.js.map +7 -0
  44. package/dist/{chunk-A7X6OCZE.js → chunk-ERKWSZ3K.js} +1 -1
  45. package/dist/{chunk-UYRR6F5S.js → chunk-FSSZHQEJ.js} +9 -3
  46. package/dist/{chunk-UYRR6F5S.js.map → chunk-FSSZHQEJ.js.map} +1 -1
  47. package/dist/chunk-GV73HKJO.js +5473 -0
  48. package/dist/chunk-GV73HKJO.js.map +7 -0
  49. package/dist/{chunk-GZTCXXSS.js → chunk-GZ4BEVMZ.js} +57 -46
  50. package/dist/{chunk-GZTCXXSS.js.map → chunk-GZ4BEVMZ.js.map} +1 -1
  51. package/dist/chunk-HLBLZKZH.js +45 -0
  52. package/dist/chunk-HLBLZKZH.js.map +7 -0
  53. package/dist/chunk-JLVECHVJ.js +36 -0
  54. package/dist/chunk-JLVECHVJ.js.map +7 -0
  55. package/dist/chunk-KNSAVNMD.js +683 -0
  56. package/dist/{chunk-F3COCCAE.js.map → chunk-KNSAVNMD.js.map} +1 -1
  57. package/dist/{chunk-V5U6BHT2.js → chunk-KRN3WHHL.js} +7 -3
  58. package/dist/{chunk-V5U6BHT2.js.map → chunk-KRN3WHHL.js.map} +1 -1
  59. package/dist/{chunk-3LMXSKZ7.js → chunk-NFYAVT54.js} +1 -1
  60. package/dist/chunk-NT7RDVDA.js +33 -0
  61. package/dist/{chunk-KQSHIOZK.js.map → chunk-NT7RDVDA.js.map} +1 -1
  62. package/dist/chunk-NW7WSLD5.js +166 -0
  63. package/dist/{chunk-ZYSVG4X3.js.map → chunk-NW7WSLD5.js.map} +2 -2
  64. package/dist/{chunk-HSJ6HYAO.js → chunk-P52SGBC4.js} +18 -10
  65. package/dist/chunk-P52SGBC4.js.map +7 -0
  66. package/dist/{chunk-XXU2NVOE.js → chunk-PC6QOCGI.js} +30 -6
  67. package/dist/chunk-PC6QOCGI.js.map +7 -0
  68. package/dist/{chunk-N5OHRWG2.js → chunk-QSRXXZO7.js} +4 -2
  69. package/dist/{chunk-N5OHRWG2.js.map → chunk-QSRXXZO7.js.map} +1 -1
  70. package/dist/{chunk-DEF3KFP7.js → chunk-QZFKONA3.js} +4 -2
  71. package/dist/{chunk-DEF3KFP7.js.map → chunk-QZFKONA3.js.map} +1 -1
  72. package/dist/{chunk-JWXQNBBA.js → chunk-RE226X4F.js} +7 -1
  73. package/dist/{chunk-JWXQNBBA.js.map → chunk-RE226X4F.js.map} +1 -1
  74. package/dist/chunk-RF57YWGW.js +88 -0
  75. package/dist/chunk-RF57YWGW.js.map +7 -0
  76. package/dist/chunk-UGBECBIR.js +62 -0
  77. package/dist/chunk-UGBECBIR.js.map +7 -0
  78. package/dist/chunk-UYWZQVH5.js +35 -0
  79. package/dist/chunk-UYWZQVH5.js.map +7 -0
  80. package/dist/{chunk-LOIZNQOU.js → chunk-VHZRJ7RI.js} +9 -3
  81. package/dist/{chunk-LOIZNQOU.js.map → chunk-VHZRJ7RI.js.map} +1 -1
  82. package/dist/{chunk-XMGUQHMF.js → chunk-VSSVN6WG.js} +11 -1
  83. package/dist/chunk-VSSVN6WG.js.map +7 -0
  84. package/dist/{chunk-OZHBEG7U.js → chunk-XV7LPJNT.js} +15 -5
  85. package/dist/{chunk-OZHBEG7U.js.map → chunk-XV7LPJNT.js.map} +1 -1
  86. package/dist/chunk-Y7MDOB3N.js +65 -0
  87. package/dist/chunk-Y7MDOB3N.js.map +7 -0
  88. package/dist/{chunk-BWYKUDJR.js → chunk-ZLAB3Z4G.js} +14 -8
  89. package/dist/{chunk-BWYKUDJR.js.map → chunk-ZLAB3Z4G.js.map} +1 -1
  90. package/dist/{chunk-755HIAI3.js → chunk-ZMO4E7IW.js} +3 -42
  91. package/dist/chunk-ZMO4E7IW.js.map +7 -0
  92. package/dist/{cli-KZGF3FV5.js → cli-Z2BNJWHT.js} +251 -485
  93. package/dist/cli-Z2BNJWHT.js.map +7 -0
  94. package/dist/commands-3Y3OQOXT.js +54 -0
  95. package/dist/{config-GTJWCNPF.js → config-5RS7HDIK.js} +9 -6
  96. package/dist/{context-WF3TTXQU.js → context-XZXRRYKS.js} +8 -7
  97. package/dist/{costTracker-2G3ZI2JF.js → costTracker-VSWW7SRT.js} +3 -2
  98. package/dist/{customCommands-QOWK57EX.js → customCommands-6KDAODFQ.js} +6 -5
  99. package/dist/{env-37BAP7QF.js → env-WIM2DQ4L.js} +10 -7
  100. package/dist/{gateway-IZYO6YFJ.js → gateway-DKHC7H3K.js} +542 -96
  101. package/dist/gateway-DKHC7H3K.js.map +7 -0
  102. package/dist/identity-3KZQQVBG.js +16 -0
  103. package/dist/index.js +8 -6
  104. package/dist/index.js.map +1 -1
  105. package/dist/{kodeAgentSessionId-KTGFX2BE.js → kodeAgentSessionId-4SH24DVH.js} +1 -1
  106. package/dist/{kodeAgentSessionLoad-6F7SJXBC.js → kodeAgentSessionLoad-4S452GGD.js} +6 -5
  107. package/dist/{kodeAgentSessionResume-UEEDRJ3N.js → kodeAgentSessionResume-MSMG4QUR.js} +6 -5
  108. package/dist/{kodeAgentStreamJson-VIXFTYL5.js → kodeAgentStreamJson-4ZKIWKS3.js} +4 -2
  109. package/dist/{kodeAgentStreamJsonSession-XC3IPREZ.js → kodeAgentStreamJsonSession-CYG6MLKP.js} +15 -4
  110. package/dist/kodeAgentStreamJsonSession-CYG6MLKP.js.map +7 -0
  111. package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js → kodeAgentStructuredStdio-5DCUC6V6.js} +3 -3
  112. package/dist/{kodeHooks-V36SHCTC.js → kodeHooks-WX3N6CL6.js} +6 -5
  113. package/dist/{llm-CYUDKJNR.js → llm-V2W4KJIA.js} +239 -57
  114. package/dist/llm-V2W4KJIA.js.map +7 -0
  115. package/dist/{llmLazy-IXVVBRTN.js → llmLazy-I7SO67YA.js} +2 -2
  116. package/dist/{loader-OEJ6C3TN.js → loader-YJGRGJNH.js} +6 -5
  117. package/dist/{mcp-KE3SILMX.js → mcp-WG3RQQCZ.js} +10 -9
  118. package/dist/{mentionProcessor-GAU2WAYB.js → mentionProcessor-PKWDUKTN.js} +14 -7
  119. package/dist/{mentionProcessor-GAU2WAYB.js.map → mentionProcessor-PKWDUKTN.js.map} +1 -1
  120. package/dist/{messages-WCSGGSEU.js → messages-RXHQ6VKL.js} +2 -2
  121. package/dist/{model-4TQIV5J2.js → model-JNWAZGT7.js} +10 -7
  122. package/dist/{openai-KTZV6F7N.js → openai-6NL5UXO7.js} +8 -7
  123. package/dist/{outputStyles-WX5RYQOA.js → outputStyles-BVPXT3MW.js} +6 -5
  124. package/dist/{pluginRuntime-JXMJZ2LC.js → pluginRuntime-XHI3TCRJ.js} +11 -8
  125. package/dist/{pluginRuntime-JXMJZ2LC.js.map → pluginRuntime-XHI3TCRJ.js.map} +1 -1
  126. package/dist/{pluginValidation-JNQZYLUP.js → pluginValidation-WDFL352C.js} +8 -7
  127. package/dist/prompts-C4RUFGX2.js +58 -0
  128. package/dist/query-IA3UKMGR.js +58 -0
  129. package/dist/{responsesStreaming-2AIT6GHG.js → responsesStreaming-JORGEFQC.js} +1 -1
  130. package/dist/{ripgrep-KDPQAMB2.js → ripgrep-BHDXRABJ.js} +5 -4
  131. package/dist/sandbox-QOXESHL4.js +63 -0
  132. package/dist/{skillMarketplace-IXAGP3Q2.js → skillMarketplace-RIAMO2YA.js} +5 -4
  133. package/dist/{state-MSCYLB6Y.js → state-TM2XZQE2.js} +6 -3
  134. package/dist/structuredOutput-KAVFUV2Z.js +9 -0
  135. package/dist/theme-BXUQNXSD.js +15 -0
  136. package/dist/thinking-BCZ4WDT6.js +18 -0
  137. package/dist/{toolPermissionContext-I3IXPVED.js → toolPermissionContext-JCQ5MFUT.js} +1 -1
  138. package/dist/toolPermissionContext-JCQ5MFUT.js.map +7 -0
  139. package/dist/toolPermissionContextState-ILRPUITK.js +24 -0
  140. package/dist/toolPermissionContextState-ILRPUITK.js.map +7 -0
  141. package/dist/{toolPermissionSettings-EUZKGZU2.js → toolPermissionSettings-LNYZ6XFE.js} +9 -8
  142. package/dist/toolPermissionSettings-LNYZ6XFE.js.map +7 -0
  143. package/dist/tools-HIPUGTF5.js +55 -0
  144. package/dist/tools-HIPUGTF5.js.map +7 -0
  145. package/dist/{userInput-LJL4CVOB.js → userInput-I33T2RX2.js} +49 -34
  146. package/dist/{userInput-LJL4CVOB.js.map → userInput-I33T2RX2.js.map} +1 -1
  147. package/dist/{uuid-VA3KVASX.js → uuid-RQH3OZ3W.js} +1 -1
  148. package/dist/uuid-RQH3OZ3W.js.map +7 -0
  149. package/dist/workspace-EP63OB5S.js +21 -0
  150. package/dist/workspace-EP63OB5S.js.map +7 -0
  151. package/package.json +1 -1
  152. package/web/dist/assets/index-XuLVvSQF.js +251 -0
  153. package/web/dist/assets/index-pSid9IlY.css +10 -0
  154. package/web/dist/index.html +2 -2
  155. package/dist/REPL-IAK7ZN2Z.js +0 -42
  156. package/dist/acp-J4WDYGRX.js.map +0 -7
  157. package/dist/ask-MGUO3L35.js.map +0 -7
  158. package/dist/chunk-2C43OXE7.js.map +0 -7
  159. package/dist/chunk-2EFL22PV.js.map +0 -7
  160. package/dist/chunk-53A4JHFW.js.map +0 -7
  161. package/dist/chunk-755HIAI3.js.map +0 -7
  162. package/dist/chunk-AXWJI6N5.js +0 -11
  163. package/dist/chunk-F3COCCAE.js +0 -654
  164. package/dist/chunk-HSJ6HYAO.js.map +0 -7
  165. package/dist/chunk-IIFUDVGS.js.map +0 -7
  166. package/dist/chunk-IM33F5CM.js.map +0 -7
  167. package/dist/chunk-KQSHIOZK.js +0 -24
  168. package/dist/chunk-OJIMOLIC.js.map +0 -7
  169. package/dist/chunk-XMGUQHMF.js.map +0 -7
  170. package/dist/chunk-XXU2NVOE.js.map +0 -7
  171. package/dist/chunk-ZYSVG4X3.js +0 -151
  172. package/dist/cli-KZGF3FV5.js.map +0 -7
  173. package/dist/commands-AVEBLFVS.js +0 -46
  174. package/dist/gateway-IZYO6YFJ.js.map +0 -7
  175. package/dist/kodeAgentStreamJsonSession-XC3IPREZ.js.map +0 -7
  176. package/dist/llm-CYUDKJNR.js.map +0 -7
  177. package/dist/prompts-LE6GK75N.js +0 -48
  178. package/dist/query-GGIP6PWG.js +0 -50
  179. package/dist/theme-GAMFOLBW.js +0 -14
  180. package/dist/tools-3HOUIDM3.js +0 -47
  181. package/web/dist/assets/index-COAJqX1Z.css +0 -1
  182. package/web/dist/assets/index-CzS_4LmC.js +0 -179
  183. /package/dist/{REPL-IAK7ZN2Z.js.map → REPL-CTTH53A7.js.map} +0 -0
  184. /package/dist/{autoUpdater-2GS6LRPK.js.map → autoUpdater-DKMSJXWW.js.map} +0 -0
  185. /package/dist/{chunk-RUXIBQ3B.js.map → chunk-7E2L7EH2.js.map} +0 -0
  186. /package/dist/{chunk-XS6PU75S.js.map → chunk-APSIF3YK.js.map} +0 -0
  187. /package/dist/{chunk-AXWJI6N5.js.map → chunk-D4OZACS2.js.map} +0 -0
  188. /package/dist/{chunk-A7X6OCZE.js.map → chunk-ERKWSZ3K.js.map} +0 -0
  189. /package/dist/{chunk-3LMXSKZ7.js.map → chunk-NFYAVT54.js.map} +0 -0
  190. /package/dist/{commands-AVEBLFVS.js.map → commands-3Y3OQOXT.js.map} +0 -0
  191. /package/dist/{config-GTJWCNPF.js.map → config-5RS7HDIK.js.map} +0 -0
  192. /package/dist/{context-WF3TTXQU.js.map → context-XZXRRYKS.js.map} +0 -0
  193. /package/dist/{costTracker-2G3ZI2JF.js.map → costTracker-VSWW7SRT.js.map} +0 -0
  194. /package/dist/{customCommands-QOWK57EX.js.map → customCommands-6KDAODFQ.js.map} +0 -0
  195. /package/dist/{env-37BAP7QF.js.map → env-WIM2DQ4L.js.map} +0 -0
  196. /package/dist/{kodeAgentSessionId-KTGFX2BE.js.map → identity-3KZQQVBG.js.map} +0 -0
  197. /package/dist/{kodeAgentSessionLoad-6F7SJXBC.js.map → kodeAgentSessionId-4SH24DVH.js.map} +0 -0
  198. /package/dist/{kodeAgentSessionResume-UEEDRJ3N.js.map → kodeAgentSessionLoad-4S452GGD.js.map} +0 -0
  199. /package/dist/{kodeAgentStreamJson-VIXFTYL5.js.map → kodeAgentSessionResume-MSMG4QUR.js.map} +0 -0
  200. /package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js.map → kodeAgentStreamJson-4ZKIWKS3.js.map} +0 -0
  201. /package/dist/{kodeHooks-V36SHCTC.js.map → kodeAgentStructuredStdio-5DCUC6V6.js.map} +0 -0
  202. /package/dist/{llmLazy-IXVVBRTN.js.map → kodeHooks-WX3N6CL6.js.map} +0 -0
  203. /package/dist/{loader-OEJ6C3TN.js.map → llmLazy-I7SO67YA.js.map} +0 -0
  204. /package/dist/{mcp-KE3SILMX.js.map → loader-YJGRGJNH.js.map} +0 -0
  205. /package/dist/{messages-WCSGGSEU.js.map → mcp-WG3RQQCZ.js.map} +0 -0
  206. /package/dist/{model-4TQIV5J2.js.map → messages-RXHQ6VKL.js.map} +0 -0
  207. /package/dist/{openai-KTZV6F7N.js.map → model-JNWAZGT7.js.map} +0 -0
  208. /package/dist/{outputStyles-WX5RYQOA.js.map → openai-6NL5UXO7.js.map} +0 -0
  209. /package/dist/{pluginValidation-JNQZYLUP.js.map → outputStyles-BVPXT3MW.js.map} +0 -0
  210. /package/dist/{prompts-LE6GK75N.js.map → pluginValidation-WDFL352C.js.map} +0 -0
  211. /package/dist/{query-GGIP6PWG.js.map → prompts-C4RUFGX2.js.map} +0 -0
  212. /package/dist/{responsesStreaming-2AIT6GHG.js.map → query-IA3UKMGR.js.map} +0 -0
  213. /package/dist/{ripgrep-KDPQAMB2.js.map → responsesStreaming-JORGEFQC.js.map} +0 -0
  214. /package/dist/{skillMarketplace-IXAGP3Q2.js.map → ripgrep-BHDXRABJ.js.map} +0 -0
  215. /package/dist/{state-MSCYLB6Y.js.map → sandbox-QOXESHL4.js.map} +0 -0
  216. /package/dist/{theme-GAMFOLBW.js.map → skillMarketplace-RIAMO2YA.js.map} +0 -0
  217. /package/dist/{toolPermissionContext-I3IXPVED.js.map → state-TM2XZQE2.js.map} +0 -0
  218. /package/dist/{toolPermissionSettings-EUZKGZU2.js.map → structuredOutput-KAVFUV2Z.js.map} +0 -0
  219. /package/dist/{tools-3HOUIDM3.js.map → theme-BXUQNXSD.js.map} +0 -0
  220. /package/dist/{uuid-VA3KVASX.js.map → thinking-BCZ4WDT6.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/constants/models.ts", "../src/utils/terminal/index.ts", "../src/ui/components/Logo.tsx", "../src/ui/hooks/useDoublePress.ts", "../src/utils/terminal/paste.ts", "../src/ui/components/TextInput.tsx", "../src/ui/hooks/useTextInput.ts", "../src/utils/terminal/cursor.ts", "../src/utils/terminal/imagePaste.ts", "../src/ui/components/custom-select/select.tsx", "../src/ui/components/custom-select/select-option.tsx", "../src/ui/components/custom-select/use-select-state.ts", "../src/ui/components/custom-select/option-map.ts", "../src/ui/components/custom-select/use-select.ts", "../src/ui/components/StructuredDiff.tsx", "../src/utils/permissions/filesystem.ts", "../src/ui/hooks/useExitOnCtrlCD.ts", "../src/ui/components/Onboarding.tsx", "../src/ui/components/PressEnterToContinue.tsx", "../src/ui/components/model-selector/ModelSelector.tsx", "../src/services/ai/gpt5ConnectionTest.ts", "../src/ui/components/model-selector/ScreenContainer.tsx", "../src/ui/components/model-selector/options.ts", "../src/ui/components/model-selector/printModelConfig.ts", "../src/ui/components/model-selector/useEscapeNavigation.ts", "../src/ui/components/model-selector/modelFetchers.ts", "../src/ui/components/model-selector/ModelSelectionScreen.tsx", "../src/ui/components/model-selector/filterModels.ts"],
4
+ "sourcesContent": ["export default {\r\n openai: [\r\n {\r\n model: 'gpt-4',\r\n max_tokens: 4096,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 4096,\r\n input_cost_per_token: 0.00003,\r\n output_cost_per_token: 0.00006,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4o',\r\n max_tokens: 16384,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 16384,\r\n input_cost_per_token: 0.0000025,\r\n output_cost_per_token: 0.00001,\r\n input_cost_per_token_batches: 0.00000125,\r\n output_cost_per_token_batches: 0.000005,\r\n cache_read_input_token_cost: 0.00000125,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_response_schema: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4.5-preview',\r\n max_tokens: 16384,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 16384,\r\n input_cost_per_token: 0.000075,\r\n output_cost_per_token: 0.00015,\r\n input_cost_per_token_batches: 0.0000375,\r\n output_cost_per_token_batches: 0.000075,\r\n cache_read_input_token_cost: 0.0000375,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_response_schema: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4.5-preview-2025-02-27',\r\n max_tokens: 16384,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 16384,\r\n input_cost_per_token: 0.000075,\r\n output_cost_per_token: 0.00015,\r\n input_cost_per_token_batches: 0.0000375,\r\n output_cost_per_token_batches: 0.000075,\r\n cache_read_input_token_cost: 0.0000375,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_response_schema: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4o-mini',\r\n max_tokens: 16384,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 16384,\r\n input_cost_per_token: 1.5e-7,\r\n output_cost_per_token: 6e-7,\r\n input_cost_per_token_batches: 7.5e-8,\r\n output_cost_per_token_batches: 3e-7,\r\n cache_read_input_token_cost: 7.5e-8,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_response_schema: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4o-mini-2024-07-18',\r\n max_tokens: 16384,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 16384,\r\n input_cost_per_token: 1.5e-7,\r\n output_cost_per_token: 6e-7,\r\n input_cost_per_token_batches: 7.5e-8,\r\n output_cost_per_token_batches: 3e-7,\r\n cache_read_input_token_cost: 7.5e-8,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_response_schema: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'o1',\r\n max_tokens: 100000,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 100000,\r\n input_cost_per_token: 0.000015,\r\n output_cost_per_token: 0.00006,\r\n cache_read_input_token_cost: 0.0000075,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n supports_reasoning_effort: true,\r\n },\r\n {\r\n model: 'o3-mini',\r\n max_tokens: 100000,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 100000,\r\n input_cost_per_token: 0.0000011,\r\n output_cost_per_token: 0.0000044,\r\n cache_read_input_token_cost: 5.5e-7,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: false,\r\n supports_vision: false,\r\n supports_prompt_caching: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n supports_reasoning_effort: true,\r\n },\r\n {\r\n model: 'o3-mini-2025-01-31',\r\n max_tokens: 100000,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 100000,\r\n input_cost_per_token: 0.0000011,\r\n output_cost_per_token: 0.0000044,\r\n cache_read_input_token_cost: 5.5e-7,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: false,\r\n supports_vision: false,\r\n supports_prompt_caching: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n supports_reasoning_effort: true,\r\n },\r\n {\r\n model: 'o1-2024-12-17',\r\n max_tokens: 100000,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 100000,\r\n input_cost_per_token: 0.000015,\r\n output_cost_per_token: 0.00006,\r\n cache_read_input_token_cost: 0.0000075,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n supports_reasoning_effort: true,\r\n },\r\n {\r\n model: 'chatgpt-4o-latest',\r\n max_tokens: 4096,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 4096,\r\n input_cost_per_token: 0.000005,\r\n output_cost_per_token: 0.000015,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4o-2024-05-13',\r\n max_tokens: 4096,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 4096,\r\n input_cost_per_token: 0.000005,\r\n output_cost_per_token: 0.000015,\r\n input_cost_per_token_batches: 0.0000025,\r\n output_cost_per_token_batches: 0.0000075,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4o-2024-08-06',\r\n max_tokens: 16384,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 16384,\r\n input_cost_per_token: 0.0000025,\r\n output_cost_per_token: 0.00001,\r\n input_cost_per_token_batches: 0.00000125,\r\n output_cost_per_token_batches: 0.000005,\r\n cache_read_input_token_cost: 0.00000125,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_response_schema: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4o-2024-11-20',\r\n max_tokens: 16384,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 16384,\r\n input_cost_per_token: 0.0000025,\r\n output_cost_per_token: 0.00001,\r\n input_cost_per_token_batches: 0.00000125,\r\n output_cost_per_token_batches: 0.000005,\r\n cache_read_input_token_cost: 0.00000125,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_response_schema: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-4-turbo',\r\n max_tokens: 4096,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 4096,\r\n input_cost_per_token: 0.00001,\r\n output_cost_per_token: 0.00003,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gpt-5',\r\n max_tokens: 32768,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 32768,\r\n input_cost_per_token: 0.00001,\r\n output_cost_per_token: 0.00005,\r\n cache_read_input_token_cost: 0.000005,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n supports_reasoning_effort: true,\r\n supports_responses_api: true,\r\n supports_custom_tools: true,\r\n supports_allowed_tools: true,\r\n supports_verbosity_control: true,\r\n },\r\n {\r\n model: 'gpt-5-mini',\r\n max_tokens: 16384,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 16384,\r\n input_cost_per_token: 0.000001,\r\n output_cost_per_token: 0.000005,\r\n cache_read_input_token_cost: 0.0000005,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n supports_reasoning_effort: true,\r\n supports_responses_api: true,\r\n supports_custom_tools: true,\r\n supports_allowed_tools: true,\r\n supports_verbosity_control: true,\r\n },\r\n {\r\n model: 'gpt-5-nano',\r\n max_tokens: 8192,\r\n max_input_tokens: 64000,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 0.0000005,\r\n output_cost_per_token: 0.000002,\r\n cache_read_input_token_cost: 0.00000025,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: false,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n supports_reasoning_effort: true,\r\n supports_responses_api: true,\r\n supports_custom_tools: true,\r\n supports_allowed_tools: true,\r\n supports_verbosity_control: true,\r\n },\r\n {\r\n model: 'gpt-5-chat-latest',\r\n max_tokens: 32768,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 32768,\r\n input_cost_per_token: 0.00001,\r\n output_cost_per_token: 0.00005,\r\n cache_read_input_token_cost: 0.000005,\r\n provider: 'openai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_parallel_function_calling: true,\r\n supports_vision: true,\r\n supports_prompt_caching: true,\r\n supports_system_messages: true,\r\n supports_tool_choice: true,\r\n supports_reasoning_effort: true,\r\n supports_responses_api: false,\r\n supports_custom_tools: false,\r\n supports_allowed_tools: false,\r\n supports_verbosity_control: true,\r\n requires_chat_completions: true,\r\n },\r\n ],\r\n mistral: [\r\n {\r\n model: 'mistral-small',\r\n max_tokens: 8191,\r\n max_input_tokens: 32000,\r\n max_output_tokens: 8191,\r\n input_cost_per_token: 0.000001,\r\n output_cost_per_token: 0.000003,\r\n provider: 'mistral',\r\n supports_function_calling: true,\r\n mode: 'chat',\r\n supports_assistant_prefill: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'mistral-small-latest',\r\n max_tokens: 8191,\r\n max_input_tokens: 32000,\r\n max_output_tokens: 8191,\r\n input_cost_per_token: 0.000001,\r\n output_cost_per_token: 0.000003,\r\n provider: 'mistral',\r\n supports_function_calling: true,\r\n mode: 'chat',\r\n supports_assistant_prefill: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'mistral-large-latest',\r\n max_tokens: 128000,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 128000,\r\n input_cost_per_token: 0.000002,\r\n output_cost_per_token: 0.000006,\r\n provider: 'mistral',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_assistant_prefill: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'open-mixtral-8x7b',\r\n max_tokens: 8191,\r\n max_input_tokens: 32000,\r\n max_output_tokens: 8191,\r\n input_cost_per_token: 7e-7,\r\n output_cost_per_token: 7e-7,\r\n provider: 'mistral',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_assistant_prefill: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'open-mixtral-8x22b',\r\n max_tokens: 8191,\r\n max_input_tokens: 65336,\r\n max_output_tokens: 8191,\r\n input_cost_per_token: 0.000002,\r\n output_cost_per_token: 0.000006,\r\n provider: 'mistral',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_assistant_prefill: true,\r\n supports_tool_choice: true,\r\n },\r\n ],\r\n deepseek: [\r\n {\r\n model: 'deepseek-reasoner',\r\n max_tokens: 8192,\r\n max_input_tokens: 65536,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 5.5e-7,\r\n input_cost_per_token_cache_hit: 1.4e-7,\r\n output_cost_per_token: 0.00000219,\r\n provider: 'deepseek',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_assistant_prefill: true,\r\n supports_tool_choice: true,\r\n supports_prompt_caching: true,\r\n },\r\n {\r\n model: 'deepseek-chat',\r\n max_tokens: 8192,\r\n max_input_tokens: 65536,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 2.7e-7,\r\n input_cost_per_token_cache_hit: 7e-8,\r\n cache_read_input_token_cost: 7e-8,\r\n cache_creation_input_token_cost: 0,\r\n output_cost_per_token: 0.0000011,\r\n provider: 'deepseek',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_assistant_prefill: true,\r\n supports_tool_choice: true,\r\n supports_prompt_caching: true,\r\n },\r\n {\r\n model: 'deepseek-coder',\r\n max_tokens: 4096,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 4096,\r\n input_cost_per_token: 1.4e-7,\r\n input_cost_per_token_cache_hit: 1.4e-8,\r\n output_cost_per_token: 2.8e-7,\r\n provider: 'deepseek',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_assistant_prefill: true,\r\n supports_tool_choice: true,\r\n supports_prompt_caching: true,\r\n },\r\n ],\r\n xai: [\r\n {\r\n model: 'grok-beta',\r\n max_tokens: 131072,\r\n max_input_tokens: 131072,\r\n max_output_tokens: 131072,\r\n input_cost_per_token: 0.000005,\r\n output_cost_per_token: 0.000015,\r\n provider: 'xai',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_vision: true,\r\n supports_tool_choice: true,\r\n },\r\n ],\r\n groq: [\r\n {\r\n model: 'llama-3.3-70b-versatile',\r\n max_tokens: 8192,\r\n max_input_tokens: 128000,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 5.9e-7,\r\n output_cost_per_token: 7.9e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama2-70b-4096',\r\n max_tokens: 4096,\r\n max_input_tokens: 4096,\r\n max_output_tokens: 4096,\r\n input_cost_per_token: 7e-7,\r\n output_cost_per_token: 8e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama3-8b-8192',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 5e-8,\r\n output_cost_per_token: 8e-8,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama-3.2-1b-preview',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 4e-8,\r\n output_cost_per_token: 4e-8,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama-3.2-3b-preview',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 6e-8,\r\n output_cost_per_token: 6e-8,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama-3.2-11b-text-preview',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 1.8e-7,\r\n output_cost_per_token: 1.8e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama-3.2-90b-text-preview',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 9e-7,\r\n output_cost_per_token: 9e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama3-70b-8192',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 5.9e-7,\r\n output_cost_per_token: 7.9e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama-3.1-8b-instant',\r\n max_tokens: 8000,\r\n max_input_tokens: 8000,\r\n max_output_tokens: 8000,\r\n input_cost_per_token: 5e-8,\r\n output_cost_per_token: 8e-8,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama-3.1-70b-versatile',\r\n max_tokens: 8000,\r\n max_input_tokens: 8000,\r\n max_output_tokens: 8000,\r\n input_cost_per_token: 5.9e-7,\r\n output_cost_per_token: 7.9e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama-3.1-405b-reasoning',\r\n max_tokens: 8000,\r\n max_input_tokens: 8000,\r\n max_output_tokens: 8000,\r\n input_cost_per_token: 5.9e-7,\r\n output_cost_per_token: 7.9e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'mixtral-8x7b-32768',\r\n max_tokens: 32768,\r\n max_input_tokens: 32768,\r\n max_output_tokens: 32768,\r\n input_cost_per_token: 2.4e-7,\r\n output_cost_per_token: 2.4e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gemma-7b-it',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 7e-8,\r\n output_cost_per_token: 7e-8,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'gemma2-9b-it',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 2e-7,\r\n output_cost_per_token: 2e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama3-groq-70b-8192-tool-use-preview',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 8.9e-7,\r\n output_cost_per_token: 8.9e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'llama3-groq-8b-8192-tool-use-preview',\r\n max_tokens: 8192,\r\n max_input_tokens: 8192,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 1.9e-7,\r\n output_cost_per_token: 1.9e-7,\r\n provider: 'groq',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_response_schema: true,\r\n supports_tool_choice: true,\r\n },\r\n ],\r\n anthropic: [\r\n {\r\n model: 'claude-3-5-haiku-latest',\r\n max_tokens: 8192,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 0.0000008,\r\n output_cost_per_token: 0.000004,\r\n cache_creation_input_token_cost: 0.00000125,\r\n cache_read_input_token_cost: 1e-7,\r\n provider: 'anthropic',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_vision: true,\r\n tool_use_system_prompt_tokens: 264,\r\n supports_assistant_prefill: true,\r\n supports_prompt_caching: true,\r\n supports_response_schema: true,\r\n deprecation_date: '2025-10-01',\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'claude-3-opus-latest',\r\n max_tokens: 4096,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 4096,\r\n input_cost_per_token: 0.000015,\r\n output_cost_per_token: 0.000075,\r\n cache_creation_input_token_cost: 0.00001875,\r\n cache_read_input_token_cost: 0.0000015,\r\n provider: 'anthropic',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_vision: true,\r\n tool_use_system_prompt_tokens: 395,\r\n supports_assistant_prefill: true,\r\n supports_prompt_caching: true,\r\n supports_response_schema: true,\r\n deprecation_date: '2025-03-01',\r\n supports_tool_choice: true,\r\n },\r\n {\r\n model: 'claude-3-7-sonnet-latest',\r\n max_tokens: 8192,\r\n max_input_tokens: 200000,\r\n max_output_tokens: 8192,\r\n input_cost_per_token: 0.000003,\r\n output_cost_per_token: 0.000015,\r\n cache_creation_input_token_cost: 0.00000375,\r\n cache_read_input_token_cost: 3e-7,\r\n provider: 'anthropic',\r\n mode: 'chat',\r\n supports_function_calling: true,\r\n supports_vision: true,\r\n tool_use_system_prompt_tokens: 159,\r\n supports_assistant_prefill: true,\r\n supports_prompt_caching: true,\r\n supports_response_schema: true,\r\n deprecation_date: '2025-06-01',\r\n supports_tool_choice: true,\r\n },\r\n ],\r\n gemini: [\r\n {\r\n model: 'gemini-2.0-flash',\r\n max_tokens: 8192,\r\n max_input_tokens: 1048576,\r\n max_output_tokens: 8192,\r\n max_images_per_prompt: 3000,\r\n max_videos_per_prompt: 10,\r\n max_video_length: 1,\r\n max_audio_length_hours: 8.4,\r\n max_audio_per_prompt: 1,\r\n max_pdf_size_mb: 30,\r\n input_cost_per_audio_token: 7e-7,\r\n input_cost_per_token: 0.0000001,\r\n output_cost_per_token: 0.0000004,\r\n provider: 'gemini',\r\n mode: 'chat',\r\n rpm: 10000,\r\n tpm: 10000000,\r\n supports_system_messages: true,\r\n supports_function_calling: true,\r\n supports_vision: true,\r\n supports_response_schema: true,\r\n supports_audio_output: true,\r\n supports_tool_choice: true,\r\n source: 'https://ai.google.dev/pricing#2_0flash',\r\n },\r\n {\r\n model: 'gemini-2.0-flash-lite',\r\n max_tokens: 8192,\r\n max_input_tokens: 1048576,\r\n max_output_tokens: 8192,\r\n max_images_per_prompt: 3000,\r\n max_videos_per_prompt: 10,\r\n max_video_length: 1,\r\n max_audio_length_hours: 8.4,\r\n max_audio_per_prompt: 1,\r\n max_pdf_size_mb: 30,\r\n input_cost_per_audio_token: 7.5e-8,\r\n input_cost_per_token: 0.000000075,\r\n output_cost_per_token: 0.0000003,\r\n provider: 'gemini',\r\n mode: 'chat',\r\n rpm: 60000,\r\n tpm: 10000000,\r\n supports_system_messages: true,\r\n supports_function_calling: true,\r\n supports_vision: true,\r\n supports_response_schema: true,\r\n supports_audio_output: false,\r\n supports_tool_choice: true,\r\n source:\r\n 'https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-2.0-flash-lite',\r\n },\r\n {\r\n model: 'gemini-2.0-flash-thinking-exp',\r\n max_tokens: 8192,\r\n max_input_tokens: 1048576,\r\n max_output_tokens: 8192,\r\n max_images_per_prompt: 3000,\r\n max_videos_per_prompt: 10,\r\n max_video_length: 1,\r\n max_audio_length_hours: 8.4,\r\n max_audio_per_prompt: 1,\r\n max_pdf_size_mb: 30,\r\n input_cost_per_image: 0,\r\n input_cost_per_video_per_second: 0,\r\n input_cost_per_audio_per_second: 0,\r\n input_cost_per_token: 0,\r\n input_cost_per_character: 0,\r\n input_cost_per_token_above_128k_tokens: 0,\r\n input_cost_per_character_above_128k_tokens: 0,\r\n input_cost_per_image_above_128k_tokens: 0,\r\n input_cost_per_video_per_second_above_128k_tokens: 0,\r\n input_cost_per_audio_per_second_above_128k_tokens: 0,\r\n output_cost_per_token: 0,\r\n output_cost_per_character: 0,\r\n output_cost_per_token_above_128k_tokens: 0,\r\n output_cost_per_character_above_128k_tokens: 0,\r\n provider: 'gemini',\r\n mode: 'chat',\r\n supports_system_messages: true,\r\n supports_function_calling: true,\r\n supports_vision: true,\r\n supports_response_schema: true,\r\n supports_audio_output: true,\r\n tpm: 4000000,\r\n rpm: 10,\r\n source:\r\n 'https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-2.0-flash',\r\n supports_tool_choice: true,\r\n },\r\n ],\r\n kimi: [],\r\n qwen: [],\r\n glm: [],\r\n minimax: [],\r\n 'baidu-qianfan': [],\r\n siliconflow: [],\r\n ollama: [],\r\n burncloud: [],\r\n 'minimax-coding': [],\r\n 'glm-coding': [],\r\n}\r\n\r\nexport const providers = {\r\n kimi: {\r\n name: 'Kimi (Moonshot)',\r\n baseURL: 'https://api.moonshot.cn/v1',\r\n },\r\n anthropic: {\r\n name: 'Messages API (Native)',\r\n baseURL: 'https://api.anthropic.com',\r\n },\r\n burncloud: {\r\n name: 'BurnCloud (All models)',\r\n baseURL: 'https://ai.burncloud.com/v1',\r\n },\r\n deepseek: {\r\n name: 'DeepSeek',\r\n baseURL: 'https://api.deepseek.com',\r\n },\r\n qwen: {\r\n name: 'Qwen (Alibaba)',\r\n baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\r\n },\r\n openai: {\r\n name: 'OpenAI',\r\n baseURL: 'https://api.openai.com/v1',\r\n },\r\n ollama: {\r\n name: 'Ollama',\r\n baseURL: 'http://localhost:11434/v1',\r\n },\r\n gemini: {\r\n name: 'Gemini',\r\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai',\r\n },\r\n 'custom-openai': {\r\n name: 'Custom OpenAI-Compatible API',\r\n baseURL: '',\r\n },\r\n openrouter: {\r\n name: 'OpenRouter',\r\n baseURL: 'https://openrouter.ai/api/v1',\r\n },\r\n minimax: {\r\n name: 'MiniMax',\r\n baseURL: 'https://api.minimaxi.com/v1',\r\n },\r\n 'minimax-coding': {\r\n name: 'MiniMax Coding Plan',\r\n baseURL: 'https://api.minimaxi.com/anthropic',\r\n },\r\n siliconflow: {\r\n name: 'SiliconFlow',\r\n baseURL: 'https://api.siliconflow.cn/v1',\r\n },\r\n glm: {\r\n name: 'GLM (Zhipu AI)',\r\n baseURL: 'https://open.bigmodel.cn/api/paas/v4',\r\n },\r\n 'glm-coding': {\r\n name: 'GLM Coding Plan',\r\n baseURL: 'https://open.bigmodel.cn/api/coding/paas/v4',\r\n },\r\n 'baidu-qianfan': {\r\n name: 'Baidu Qianfan',\r\n baseURL: 'https://qianfan.baidubce.com/v2',\r\n },\r\n mistral: {\r\n name: 'Mistral',\r\n baseURL: 'https://api.mistral.ai/v1',\r\n },\r\n xai: {\r\n name: 'xAI',\r\n baseURL: 'https://api.x.ai/v1',\r\n },\r\n groq: {\r\n name: 'Groq',\r\n baseURL: 'https://api.groq.com/openai/v1',\r\n },\r\n azure: {\r\n name: 'Azure OpenAI',\r\n baseURL: '',\r\n },\r\n}\r\n", "import { safeParseJSON } from '@utils/text/json'\r\nimport { logError } from '@utils/log'\r\n\r\nexport function setTerminalTitle(title: string): void {\r\n if (process.platform === 'win32') {\r\n process.title = title ? `\u2733 ${title}` : title\r\n } else {\r\n process.stdout.write(`\\x1b]0;${title ? `\u2733 ${title}` : ''}\\x07`)\r\n }\r\n}\r\n\r\nexport async function updateTerminalTitle(message: string): Promise<void> {\r\n try {\r\n const { queryQuick } = await import('@services/llm')\r\n const result = await queryQuick({\r\n systemPrompt: [\r\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.\",\r\n ],\r\n userPrompt: message,\r\n enablePromptCaching: true,\r\n })\r\n\r\n const content = result.message.content\r\n .filter(_ => _.type === 'text')\r\n .map(_ => _.text)\r\n .join('')\r\n\r\n const response = safeParseJSON(content)\r\n if (\r\n response &&\r\n typeof response === 'object' &&\r\n 'isNewTopic' in response &&\r\n 'title' in response\r\n ) {\r\n if (response.isNewTopic && response.title) {\r\n setTerminalTitle(response.title as string)\r\n }\r\n }\r\n } catch (error) {\r\n logError(error)\r\n }\r\n}\r\n\r\nexport function clearTerminal(): Promise<void> {\r\n return new Promise(resolve => {\r\n process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H', () => {\r\n resolve()\r\n })\r\n })\r\n}\r\n", "import { Box, Text, Newline } from 'ink'\r\nimport * as React from 'react'\r\nimport { getTheme } from '@utils/theme'\r\nimport { PRODUCT_NAME } from '@constants/product'\r\nimport { getGlobalConfig } from '@utils/config'\r\nimport { getCwd } from '@utils/state'\r\nimport { AsciiLogo } from './AsciiLogo'\r\nimport type { WrappedClient } from '@services/mcpClient'\r\nimport { getModelManager } from '@utils/model'\r\nimport { MACRO } from '@constants/macros'\r\n\r\nexport const MIN_LOGO_WIDTH = 50\r\n\r\nconst DEFAULT_UPDATE_COMMANDS = [\r\n 'bun add -g newcraw@latest',\r\n 'npm install -g newcraw@latest',\r\n] as const\r\n\r\nexport function Logo({\r\n mcpClients,\r\n isDefaultModel = false,\r\n updateBannerVersion,\r\n updateBannerCommands,\r\n}: {\r\n mcpClients: WrappedClient[]\r\n isDefaultModel?: boolean\r\n updateBannerVersion?: string | null\r\n updateBannerCommands?: string[] | null\r\n}): React.ReactNode {\r\n const width = Math.max(MIN_LOGO_WIDTH, getCwd().length + 12)\r\n const theme = getTheme()\r\n const config = getGlobalConfig()\r\n\r\n const modelManager = getModelManager()\r\n const mainModelName = modelManager.getModelName('main')\r\n const currentModel = mainModelName || 'No model configured'\r\n const hasOverrides = Boolean(\r\n process.env.DISABLE_PROMPT_CACHING ||\r\n process.env.API_TIMEOUT_MS ||\r\n process.env.MAX_THINKING_TOKENS,\r\n )\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box\r\n borderColor={theme.newcraw}\r\n borderStyle=\"round\"\r\n flexDirection=\"column\"\r\n gap={1}\r\n paddingLeft={1}\r\n marginRight={2}\r\n width={width}\r\n >\r\n {updateBannerVersion ? (\r\n <Box flexDirection=\"column\">\r\n <Text color=\"yellow\">\r\n New version available: {updateBannerVersion} (current:{' '}\r\n {MACRO.VERSION})\r\n </Text>\r\n <Text>Run the following command to update:</Text>\r\n <Text>\r\n {' '}\r\n {updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]}\r\n </Text>\r\n {process.platform !== 'win32' && (\r\n <Text dimColor>\r\n Note: you may need to prefix with \"sudo\" on macOS/Linux.\r\n </Text>\r\n )}\r\n </Box>\r\n ) : null}\r\n <Text>\r\n <Text color={theme.newcraw}>\u273B</Text> Welcome to{' '}\r\n <Text bold>{PRODUCT_NAME}</Text> <Text>research preview!</Text>\r\n </Text>\r\n {}\r\n\r\n <>\r\n <Box paddingLeft={2} flexDirection=\"column\" gap={1}>\r\n <Text color={theme.secondaryText} italic>\r\n /help for help\r\n </Text>\r\n <Text color={theme.secondaryText}>cwd: {getCwd()}</Text>\r\n </Box>\r\n\r\n {hasOverrides && (\r\n <Box\r\n borderColor={theme.secondaryBorder}\r\n borderStyle=\"single\"\r\n borderBottom={false}\r\n borderLeft={false}\r\n borderRight={false}\r\n borderTop={true}\r\n flexDirection=\"column\"\r\n marginLeft={2}\r\n marginRight={1}\r\n paddingTop={1}\r\n >\r\n <Box marginBottom={1}>\r\n <Text color={theme.secondaryText}>Overrides (via env):</Text>\r\n </Box>\r\n {process.env.DISABLE_PROMPT_CACHING ? (\r\n <Text color={theme.secondaryText}>\r\n \u2022 Prompt caching:{' '}\r\n <Text color={theme.error} bold>\r\n off\r\n </Text>\r\n </Text>\r\n ) : null}\r\n {process.env.API_TIMEOUT_MS ? (\r\n <Text color={theme.secondaryText}>\r\n \u2022 API timeout:{' '}\r\n <Text bold>{process.env.API_TIMEOUT_MS}ms</Text>\r\n </Text>\r\n ) : null}\r\n {process.env.MAX_THINKING_TOKENS ? (\r\n <Text color={theme.secondaryText}>\r\n \u2022 Max thinking tokens:{' '}\r\n <Text bold>{process.env.MAX_THINKING_TOKENS}</Text>\r\n </Text>\r\n ) : null}\r\n </Box>\r\n )}\r\n </>\r\n {mcpClients.length ? (\r\n <Box\r\n borderColor={theme.secondaryBorder}\r\n borderStyle=\"single\"\r\n borderBottom={false}\r\n borderLeft={false}\r\n borderRight={false}\r\n borderTop={true}\r\n flexDirection=\"column\"\r\n marginLeft={2}\r\n marginRight={1}\r\n paddingTop={1}\r\n >\r\n <Box marginBottom={1}>\r\n <Text color={theme.secondaryText}>MCP Servers:</Text>\r\n </Box>\r\n {mcpClients.map((client, idx) => (\r\n <Box key={idx} width={width - 6}>\r\n <Text color={theme.secondaryText}>\u2022 {client.name}</Text>\r\n <Box flexGrow={1} />\r\n <Text\r\n bold\r\n color={\r\n client.type === 'connected' ? theme.success : theme.error\r\n }\r\n >\r\n {client.type === 'connected' ? 'connected' : 'failed'}\r\n </Text>\r\n </Box>\r\n ))}\r\n </Box>\r\n ) : null}\r\n </Box>\r\n </Box>\r\n )\r\n}\r\n", "\r\nimport { useRef } from 'react'\r\n\r\nexport const DOUBLE_PRESS_TIMEOUT_MS = 2000\r\n\r\nexport function useDoublePress(\r\n setPending: (pending: boolean) => void,\r\n onDoublePress: () => void,\r\n onFirstPress?: () => void,\r\n): () => void {\r\n const lastPressRef = useRef<number>(0)\r\n const timeoutRef = useRef<NodeJS.Timeout>()\r\n\r\n return () => {\r\n const now = Date.now()\r\n const timeSinceLastPress = now - lastPressRef.current\r\n\r\n if (timeSinceLastPress <= DOUBLE_PRESS_TIMEOUT_MS && timeoutRef.current) {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n timeoutRef.current = undefined\r\n }\r\n onDoublePress()\r\n setPending(false)\r\n } else {\r\n onFirstPress?.()\r\n setPending(true)\r\n timeoutRef.current = setTimeout(\r\n () => setPending(false),\r\n DOUBLE_PRESS_TIMEOUT_MS,\r\n )\r\n }\r\n\r\n lastPressRef.current = now\r\n }\r\n}\r\n", "export function normalizeLineEndings(text: string): string {\r\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\r\n}\r\n\r\nexport function countLineBreaks(text: string): number {\r\n return (text.match(/\\r\\n|\\r|\\n/g) || []).length\r\n}\r\n\r\nexport const SPECIAL_PASTE_CHAR_THRESHOLD = 800\r\n\r\nexport function getSpecialPasteNewlineThreshold(terminalRows: number): number {\r\n return Math.min(terminalRows - 10, 2)\r\n}\r\n\r\nexport type SpecialPasteOptions = {\r\n terminalRows?: number\r\n charThreshold?: number\r\n}\r\n\r\nexport function shouldTreatAsSpecialPaste(\r\n text: string,\r\n options: SpecialPasteOptions = {},\r\n): boolean {\r\n const normalized = normalizeLineEndings(text)\r\n\r\n const terminalRows = options.terminalRows ?? process.stdout?.rows ?? 24\r\n const charThreshold = options.charThreshold ?? SPECIAL_PASTE_CHAR_THRESHOLD\r\n const newlineThreshold = getSpecialPasteNewlineThreshold(terminalRows)\r\n\r\n const newlineCount = countLineBreaks(normalized)\r\n return normalized.length > charThreshold || newlineCount > newlineThreshold\r\n}\r\n\r\nexport function shouldAggregatePasteChunk(\r\n input: string,\r\n hasPendingTimeout: boolean,\r\n): boolean {\r\n if (hasPendingTimeout) return true\r\n if (input.length > SPECIAL_PASTE_CHAR_THRESHOLD) return true\r\n\r\n if (input === '\\x1b\\r' || input === '\\x1b\\n') return false\r\n\r\n if (input.length > 1 && (input.includes('\\n') || input.includes('\\r')))\r\n return true\r\n\r\n return false\r\n}\r\n", "import React from 'react'\r\nimport { Text, useInput } from 'ink'\r\nimport chalk from 'chalk'\r\nimport { useTextInput } from '@hooks/useTextInput'\r\nimport { getTheme } from '@utils/theme'\r\nimport { type Key } from 'ink'\r\nimport {\r\n normalizeLineEndings,\r\n shouldTreatAsSpecialPaste,\r\n shouldAggregatePasteChunk,\r\n} from '@utils/terminal/paste'\r\n\r\nconst BRACKETED_PASTE_ENABLE = '\\x1b[?2004h'\r\nconst BRACKETED_PASTE_DISABLE = '\\x1b[?2004l'\r\nconst BRACKETED_PASTE_START = '\\x1b[200~'\r\nconst BRACKETED_PASTE_END = '\\x1b[201~'\r\nconst BRACKETED_PASTE_START_NO_ESC = '[200~'\r\nconst BRACKETED_PASTE_END_NO_ESC = '[201~'\r\n\r\nlet bracketedPasteRefCount = 0\r\n\r\nfunction setBracketedPasteEnabled(enabled: boolean) {\r\n if (!process.stdout?.isTTY) return\r\n process.stdout.write(\r\n enabled ? BRACKETED_PASTE_ENABLE : BRACKETED_PASTE_DISABLE,\r\n )\r\n}\r\n\r\nfunction acquireBracketedPasteMode() {\r\n if (bracketedPasteRefCount === 0) {\r\n setBracketedPasteEnabled(true)\r\n }\r\n bracketedPasteRefCount++\r\n}\r\n\r\nfunction releaseBracketedPasteMode() {\r\n bracketedPasteRefCount = Math.max(0, bracketedPasteRefCount - 1)\r\n if (bracketedPasteRefCount === 0) {\r\n setBracketedPasteEnabled(false)\r\n }\r\n}\r\n\r\nexport type Props = {\r\n readonly onHistoryUp?: () => void\r\n\r\n readonly onHistoryDown?: () => void\r\n\r\n readonly placeholder?: string\r\n\r\n readonly multiline?: boolean\r\n\r\n readonly focus?: boolean\r\n\r\n readonly mask?: string\r\n\r\n readonly showCursor?: boolean\r\n\r\n readonly highlightPastedText?: boolean\r\n\r\n readonly value: string\r\n\r\n readonly onChange: (value: string) => void\r\n\r\n readonly onSubmit?: (value: string) => void\r\n\r\n readonly onExit?: () => void\r\n\r\n readonly onExitMessage?: (show: boolean, key?: string) => void\r\n\r\n readonly onMessage?: (show: boolean, message?: string) => void\r\n\r\n readonly onHistoryReset?: () => void\r\n\r\n readonly columns: number\r\n\r\n readonly onImagePaste?: (base64Image: string) => string | void\r\n\r\n readonly onPaste?: (text: string) => void\r\n\r\n readonly isDimmed?: boolean\r\n\r\n readonly disableCursorMovementForUpDownKeys?: boolean\r\n\r\n readonly onSpecialKey?: (input: string, key: Key) => boolean\r\n\r\n readonly cursorOffset: number\r\n\r\n onChangeCursorOffset: (offset: number) => void\r\n}\r\n\r\nexport default function TextInput({\r\n value: originalValue,\r\n placeholder = '',\r\n focus = true,\r\n mask,\r\n multiline = false,\r\n highlightPastedText = false,\r\n showCursor = true,\r\n onChange,\r\n onSubmit,\r\n onExit,\r\n onHistoryUp,\r\n onHistoryDown,\r\n onExitMessage,\r\n onMessage,\r\n onHistoryReset,\r\n columns,\r\n onImagePaste,\r\n onPaste,\r\n isDimmed = false,\r\n disableCursorMovementForUpDownKeys = false,\r\n onSpecialKey,\r\n cursorOffset,\r\n onChangeCursorOffset,\r\n}: Props) {\r\n const { onInput, renderedValue } = useTextInput({\r\n value: originalValue,\r\n onChange,\r\n onSubmit,\r\n onExit,\r\n onExitMessage,\r\n onMessage,\r\n onHistoryReset,\r\n onHistoryUp,\r\n onHistoryDown,\r\n focus,\r\n mask,\r\n multiline,\r\n cursorChar: showCursor ? ' ' : '',\r\n highlightPastedText,\r\n invert: chalk.inverse,\r\n themeText: (text: string) => chalk.hex(getTheme().text)(text),\r\n columns,\r\n onImagePaste,\r\n disableCursorMovementForUpDownKeys,\r\n externalOffset: cursorOffset,\r\n onOffsetChange: onChangeCursorOffset,\r\n })\r\n\r\n React.useEffect(() => {\r\n acquireBracketedPasteMode()\r\n return () => releaseBracketedPasteMode()\r\n }, [])\r\n\r\n const [pasteState, setPasteState] = React.useState<{\r\n chunks: string[]\r\n timeoutId: ReturnType<typeof setTimeout> | null\r\n }>({ chunks: [], timeoutId: null })\r\n\r\n const bracketedPasteState = React.useRef<{\r\n mode: 'normal' | 'in_paste'\r\n incomplete: string\r\n buffer: string\r\n }>({ mode: 'normal', incomplete: '', buffer: '' })\r\n\r\n const flushBracketedPasteBuffer = (rawText: string) => {\r\n const normalized = normalizeLineEndings(rawText)\r\n if (onPaste && shouldTreatAsSpecialPaste(normalized)) {\r\n Promise.resolve().then(() => onPaste(normalized))\r\n return\r\n }\r\n\r\n onInput(normalized, {} as Key)\r\n }\r\n\r\n const longestSuffixPrefix = (haystack: string, needle: string): number => {\r\n const max = Math.min(haystack.length, needle.length - 1)\r\n for (let len = max; len > 0; len--) {\r\n if (haystack.endsWith(needle.slice(0, len))) return len\r\n }\r\n return 0\r\n }\r\n\r\n const findFirstMarker = (\r\n haystack: string,\r\n markers: string[],\r\n ): { index: number; marker: string } | null => {\r\n let best: { index: number; marker: string } | null = null\r\n for (const marker of markers) {\r\n const index = haystack.indexOf(marker)\r\n if (index === -1) continue\r\n if (!best || index < best.index) {\r\n best = { index, marker }\r\n }\r\n }\r\n return best\r\n }\r\n\r\n const getSuffixKeepLength = (haystack: string, markers: string[]): number => {\r\n let keep = 0\r\n for (const marker of markers) {\r\n keep = Math.max(keep, longestSuffixPrefix(haystack, marker))\r\n }\r\n return keep\r\n }\r\n\r\n const handleBracketedPasteSequences = (input: string): boolean => {\r\n const state = bracketedPasteState.current\r\n let handledAny = false\r\n let data = state.incomplete + input\r\n state.incomplete = ''\r\n\r\n const startMarkers = [BRACKETED_PASTE_START, BRACKETED_PASTE_START_NO_ESC]\r\n const endMarkers = [BRACKETED_PASTE_END, BRACKETED_PASTE_END_NO_ESC]\r\n\r\n while (data) {\r\n if (state.mode === 'normal') {\r\n const start = findFirstMarker(data, startMarkers)\r\n if (!start) {\r\n const keep = getSuffixKeepLength(data, startMarkers)\r\n if (keep === 0) {\r\n if (!handledAny) {\r\n return false\r\n }\r\n onInput(data, {} as Key)\r\n return true\r\n }\r\n\r\n const toInsert = data.slice(0, -keep)\r\n if (toInsert) {\r\n onInput(toInsert, {} as Key)\r\n }\r\n state.incomplete = data.slice(-keep)\r\n handledAny = true\r\n return true\r\n }\r\n\r\n const before = data.slice(0, start.index)\r\n if (before) {\r\n onInput(before, {} as Key)\r\n }\r\n\r\n data = data.slice(start.index + start.marker.length)\r\n state.mode = 'in_paste'\r\n handledAny = true\r\n continue\r\n }\r\n\r\n const end = findFirstMarker(data, endMarkers)\r\n if (!end) {\r\n const keep = getSuffixKeepLength(data, endMarkers)\r\n const content = keep > 0 ? data.slice(0, -keep) : data\r\n if (content) {\r\n state.buffer += content\r\n }\r\n if (keep > 0) {\r\n state.incomplete = data.slice(-keep)\r\n }\r\n handledAny = true\r\n return true\r\n }\r\n\r\n state.buffer += data.slice(0, end.index)\r\n const completedPaste = state.buffer\r\n state.buffer = ''\r\n state.mode = 'normal'\r\n\r\n flushBracketedPasteBuffer(completedPaste)\r\n\r\n data = data.slice(end.index + end.marker.length)\r\n handledAny = true\r\n continue\r\n }\r\n\r\n return true\r\n }\r\n\r\n const resetPasteTimeout = (\r\n currentTimeoutId: ReturnType<typeof setTimeout> | null,\r\n ) => {\r\n if (currentTimeoutId) {\r\n clearTimeout(currentTimeoutId)\r\n }\r\n return setTimeout(() => {\r\n setPasteState(({ chunks }) => {\r\n const pastedText = chunks.join('')\r\n Promise.resolve().then(() => onPaste!(pastedText))\r\n return { chunks: [], timeoutId: null }\r\n })\r\n }, 500)\r\n }\r\n\r\n const wrappedOnInput = (input: string, key: Key): void => {\r\n if (/^(?:\\x1b)?\\[13;2(?:u|~)$/.test(input)) {\r\n onInput('\\r', { ...key, return: true, meta: false, shift: false } as Key)\r\n return\r\n }\r\n if (/^(?:\\x1b)?\\[13;(?:3|4)(?:u|~)$/.test(input)) {\r\n onInput('\\r', { ...key, return: true, meta: true } as Key)\r\n return\r\n }\r\n\r\n if (input === '\\n') {\r\n if (multiline) {\r\n onInput('\\n', key)\r\n return\r\n }\r\n\r\n onInput('\\r', { ...key, return: true } as Key)\r\n return\r\n }\r\n\r\n if (input === '\\x1b\\r' || input === '\\x1b\\n') {\r\n onInput('\\r', {\r\n ...key,\r\n return: true,\r\n meta: true,\r\n } as Key)\r\n return\r\n }\r\n\r\n if (onSpecialKey && onSpecialKey(input, key)) {\r\n return\r\n }\r\n\r\n if (\r\n key.backspace ||\r\n key.delete ||\r\n input === '\\b' ||\r\n input === '\\x7f' ||\r\n input === '\\x08'\r\n ) {\r\n onInput(input, {\r\n ...key,\r\n backspace: true,\r\n })\r\n return\r\n }\r\n\r\n if (input && handleBracketedPasteSequences(input)) {\r\n return\r\n }\r\n\r\n if (\r\n onPaste &&\r\n shouldAggregatePasteChunk(input, pasteState.timeoutId !== null)\r\n ) {\r\n setPasteState(({ chunks, timeoutId }) => {\r\n return {\r\n chunks: [...chunks, input],\r\n timeoutId: resetPasteTimeout(timeoutId),\r\n }\r\n })\r\n return\r\n }\r\n\r\n onInput(input, key)\r\n }\r\n\r\n useInput(wrappedOnInput, { isActive: focus })\r\n\r\n let renderedPlaceholder = placeholder\r\n ? chalk.hex(getTheme().secondaryText)(placeholder)\r\n : undefined\r\n\r\n if (showCursor && focus) {\r\n renderedPlaceholder =\r\n placeholder.length > 0\r\n ? chalk.inverse(placeholder[0]) +\r\n chalk.hex(getTheme().secondaryText)(placeholder.slice(1))\r\n : chalk.inverse(' ')\r\n }\r\n\r\n const showPlaceholder = originalValue.length == 0 && placeholder\r\n return (\r\n <Text wrap=\"truncate-end\" dimColor={isDimmed}>\r\n {showPlaceholder ? renderedPlaceholder : renderedValue}\r\n </Text>\r\n )\r\n}\r\n", "import { useState } from 'react'\r\nimport { type Key } from 'ink'\r\nimport { useDoublePress } from './useDoublePress'\r\nimport { Cursor } from '@utils/terminal/cursor'\r\nimport {\r\n getImageFromClipboard,\r\n CLIPBOARD_ERROR_MESSAGE,\r\n} from '@utils/terminal/imagePaste'\r\nimport { normalizeLineEndings } from '@utils/terminal/paste'\r\n\r\nconst IMAGE_PLACEHOLDER = '[Image pasted]'\r\n\r\ntype MaybeCursor = void | Cursor\r\ntype InputHandler = (input: string) => MaybeCursor\r\ntype InputMapper = (input: string) => MaybeCursor\r\nfunction mapInput(input_map: Array<[string, InputHandler]>): InputMapper {\r\n return function (input: string): MaybeCursor {\r\n const handler = new Map(input_map).get(input) ?? (() => {})\r\n return handler(input)\r\n }\r\n}\r\n\r\ntype UseTextInputProps = {\r\n value: string\r\n onChange: (value: string) => void\r\n onSubmit?: (value: string) => void\r\n onExit?: () => void\r\n onExitMessage?: (show: boolean, key?: string) => void\r\n onMessage?: (show: boolean, message?: string) => void\r\n onHistoryUp?: () => void\r\n onHistoryDown?: () => void\r\n onHistoryReset?: () => void\r\n focus?: boolean\r\n mask?: string\r\n multiline?: boolean\r\n cursorChar: string\r\n highlightPastedText?: boolean\r\n invert: (text: string) => string\r\n themeText: (text: string) => string\r\n columns: number\r\n onImagePaste?: (base64Image: string) => string | void\r\n disableCursorMovementForUpDownKeys?: boolean\r\n externalOffset: number\r\n onOffsetChange: (offset: number) => void\r\n}\r\n\r\ntype UseTextInputResult = {\r\n renderedValue: string\r\n onInput: (input: string, key: Key) => void\r\n offset: number\r\n setOffset: (offset: number) => void\r\n}\r\n\r\nexport function useTextInput({\r\n value: originalValue,\r\n onChange,\r\n onSubmit,\r\n onExit,\r\n onExitMessage,\r\n onMessage,\r\n onHistoryUp,\r\n onHistoryDown,\r\n onHistoryReset,\r\n mask = '',\r\n multiline = false,\r\n cursorChar,\r\n invert,\r\n columns,\r\n onImagePaste,\r\n disableCursorMovementForUpDownKeys = false,\r\n externalOffset,\r\n onOffsetChange,\r\n}: UseTextInputProps): UseTextInputResult {\r\n const offset = externalOffset\r\n const setOffset = onOffsetChange\r\n const cursor = Cursor.fromText(originalValue, columns, offset)\r\n const [imagePasteErrorTimeout, setImagePasteErrorTimeout] =\r\n useState<NodeJS.Timeout | null>(null)\r\n\r\n function maybeClearImagePasteErrorTimeout() {\r\n if (!imagePasteErrorTimeout) {\r\n return\r\n }\r\n clearTimeout(imagePasteErrorTimeout)\r\n setImagePasteErrorTimeout(null)\r\n onMessage?.(false)\r\n }\r\n\r\n const handleCtrlC = useDoublePress(\r\n show => {\r\n maybeClearImagePasteErrorTimeout()\r\n onExitMessage?.(show, 'Ctrl-C')\r\n },\r\n () => onExit?.(),\r\n () => {\r\n if (originalValue) {\r\n onChange('')\r\n onHistoryReset?.()\r\n }\r\n },\r\n )\r\n\r\n const handleEscape = useDoublePress(\r\n show => {\r\n maybeClearImagePasteErrorTimeout()\r\n onMessage?.(!!originalValue && show, `Press Escape again to clear`)\r\n },\r\n () => {\r\n if (originalValue) {\r\n onChange('')\r\n }\r\n },\r\n )\r\n function clear() {\r\n return Cursor.fromText('', columns, 0)\r\n }\r\n\r\n const handleEmptyCtrlD = useDoublePress(\r\n show => onExitMessage?.(show, 'Ctrl-D'),\r\n () => onExit?.(),\r\n )\r\n\r\n function handleCtrlD(): MaybeCursor {\r\n maybeClearImagePasteErrorTimeout()\r\n if (cursor.text === '') {\r\n handleEmptyCtrlD()\r\n return cursor\r\n }\r\n return cursor.del()\r\n }\r\n\r\n function tryImagePaste() {\r\n if (mask) {\r\n return cursor\r\n }\r\n\r\n const base64Image = getImageFromClipboard()\r\n if (base64Image === null) {\r\n if (process.platform !== 'darwin') {\r\n return cursor\r\n }\r\n onMessage?.(true, CLIPBOARD_ERROR_MESSAGE)\r\n maybeClearImagePasteErrorTimeout()\r\n setImagePasteErrorTimeout(\r\n setTimeout(() => {\r\n onMessage?.(false)\r\n }, 4000),\r\n )\r\n return cursor\r\n }\r\n\r\n const placeholder = onImagePaste?.(base64Image)\r\n return cursor.insert(\r\n typeof placeholder === 'string' ? placeholder : IMAGE_PLACEHOLDER,\r\n )\r\n }\r\n\r\n const handleCtrl = mapInput([\r\n ['a', () => cursor.startOfLine()],\r\n ['b', () => cursor.left()],\r\n ['c', handleCtrlC],\r\n ['d', handleCtrlD],\r\n ['e', () => cursor.endOfLine()],\r\n ['f', () => cursor.right()],\r\n [\r\n 'h',\r\n () => {\r\n maybeClearImagePasteErrorTimeout()\r\n return cursor.backspace()\r\n },\r\n ],\r\n ['k', () => cursor.deleteToLineEnd()],\r\n ['l', () => clear()],\r\n ['n', () => downOrHistoryDown()],\r\n ['p', () => upOrHistoryUp()],\r\n ['u', () => cursor.deleteToLineStart()],\r\n ['v', tryImagePaste],\r\n ['w', () => cursor.deleteWordBefore()],\r\n ])\r\n\r\n const handleMeta = mapInput([\r\n ['b', () => cursor.prevWord()],\r\n ['f', () => cursor.nextWord()],\r\n ['d', () => cursor.deleteWordAfter()],\r\n ])\r\n\r\n function handleEnter(key: Key) {\r\n if (!multiline) {\r\n onSubmit?.(originalValue)\r\n return\r\n }\r\n\r\n if (key.meta || ('option' in key && (key as any).option)) {\r\n return cursor.insert('\\n')\r\n }\r\n onSubmit?.(originalValue)\r\n }\r\n\r\n function upOrHistoryUp() {\r\n if (disableCursorMovementForUpDownKeys) {\r\n onHistoryUp?.()\r\n return cursor\r\n }\r\n const cursorUp = cursor.up()\r\n if (cursorUp.equals(cursor)) {\r\n onHistoryUp?.()\r\n }\r\n return cursorUp\r\n }\r\n function downOrHistoryDown() {\r\n if (disableCursorMovementForUpDownKeys) {\r\n onHistoryDown?.()\r\n return cursor\r\n }\r\n const cursorDown = cursor.down()\r\n if (cursorDown.equals(cursor)) {\r\n onHistoryDown?.()\r\n }\r\n return cursorDown\r\n }\r\n\r\n function onInput(input: string, key: Key): void {\r\n if (key.tab) {\r\n return\r\n }\r\n\r\n if (\r\n key.backspace ||\r\n key.delete ||\r\n input === '\\b' ||\r\n input === '\\x7f' ||\r\n input === '\\x08'\r\n ) {\r\n const nextCursor = cursor.backspace()\r\n if (!cursor.equals(nextCursor)) {\r\n setOffset(nextCursor.offset)\r\n if (cursor.text !== nextCursor.text) {\r\n onChange(nextCursor.text)\r\n }\r\n }\r\n return\r\n }\r\n\r\n if (!key.ctrl && !key.meta && input.length > 1) {\r\n const nextCursor = cursor.insert(normalizeLineEndings(input))\r\n if (!cursor.equals(nextCursor)) {\r\n setOffset(nextCursor.offset)\r\n if (cursor.text !== nextCursor.text) {\r\n onChange(nextCursor.text)\r\n }\r\n }\r\n return\r\n }\r\n\r\n const nextCursor = mapKey(key)(input)\r\n if (nextCursor) {\r\n if (!cursor.equals(nextCursor)) {\r\n setOffset(nextCursor.offset)\r\n if (cursor.text !== nextCursor.text) {\r\n onChange(nextCursor.text)\r\n }\r\n }\r\n }\r\n }\r\n\r\n function mapKey(key: Key): InputMapper {\r\n if (key.backspace || key.delete) {\r\n maybeClearImagePasteErrorTimeout()\r\n return () => cursor.backspace()\r\n }\r\n\r\n switch (true) {\r\n case key.escape:\r\n return handleEscape\r\n case key.leftArrow && (key.ctrl || key.meta || ('fn' in key && key.fn)):\r\n return () => cursor.prevWord()\r\n case key.rightArrow && (key.ctrl || key.meta || ('fn' in key && key.fn)):\r\n return () => cursor.nextWord()\r\n case key.ctrl:\r\n return handleCtrl\r\n case 'home' in key && key.home:\r\n return () => cursor.startOfLine()\r\n case 'end' in key && key.end:\r\n return () => cursor.endOfLine()\r\n case key.pageDown:\r\n return () => cursor.endOfLine()\r\n case key.pageUp:\r\n return () => cursor.startOfLine()\r\n case key.return:\r\n return () => handleEnter(key)\r\n case key.meta:\r\n return handleMeta\r\n case key.upArrow:\r\n return upOrHistoryUp\r\n case key.downArrow:\r\n return downOrHistoryDown\r\n case key.leftArrow:\r\n return () => cursor.left()\r\n case key.rightArrow:\r\n return () => cursor.right()\r\n }\r\n return function (input: string) {\r\n switch (true) {\r\n case input == '\\x1b[H' || input == '\\x1b[1~':\r\n return cursor.startOfLine()\r\n case input == '\\x1b[F' || input == '\\x1b[4~':\r\n return cursor.endOfLine()\r\n case input === '\\b' || input === '\\x7f' || input === '\\x08':\r\n maybeClearImagePasteErrorTimeout()\r\n return cursor.backspace()\r\n default:\r\n return cursor.insert(input.replace(/\\r/g, '\\n'))\r\n }\r\n }\r\n }\r\n\r\n return {\r\n onInput,\r\n renderedValue: cursor.render(cursorChar, mask, invert),\r\n offset,\r\n setOffset,\r\n }\r\n}\r\n", "import wrapAnsi from 'wrap-ansi'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\n\r\ntype WrappedText = string[]\r\ntype Position = {\r\n line: number\r\n column: number\r\n}\r\n\r\nexport class Cursor {\r\n readonly offset: number\r\n constructor(\r\n readonly measuredText: MeasuredText,\r\n offset: number = 0,\r\n readonly selection: number = 0,\r\n ) {\r\n this.offset = Math.max(0, Math.min(this.measuredText.text.length, offset))\r\n }\r\n\r\n static fromText(\r\n text: string,\r\n columns: number,\r\n offset: number = 0,\r\n selection: number = 0,\r\n ): Cursor {\r\n return new Cursor(new MeasuredText(text, columns - 1), offset, selection)\r\n }\r\n\r\n render(cursorChar: string, mask: string, invert: (text: string) => string) {\r\n const { line, column } = this.getPosition()\r\n return this.measuredText\r\n .getWrappedText()\r\n .map((text, currentLine, allLines) => {\r\n let displayText = text\r\n if (mask && currentLine === allLines.length - 1) {\r\n const lastSixStart = Math.max(0, text.length - 6)\r\n displayText = mask.repeat(lastSixStart) + text.slice(lastSixStart)\r\n }\r\n if (line != currentLine) return displayText.trimEnd()\r\n\r\n return (\r\n displayText.slice(0, column) +\r\n invert(displayText[column] || cursorChar) +\r\n displayText.trimEnd().slice(column + 1)\r\n )\r\n })\r\n .join('\\n')\r\n }\r\n\r\n left(): Cursor {\r\n return new Cursor(this.measuredText, this.offset - 1)\r\n }\r\n\r\n right(): Cursor {\r\n return new Cursor(this.measuredText, this.offset + 1)\r\n }\r\n\r\n up(): Cursor {\r\n const { line, column } = this.getPosition()\r\n if (line == 0) {\r\n return new Cursor(this.measuredText, 0, 0)\r\n }\r\n\r\n const newOffset = this.getOffset({ line: line - 1, column })\r\n return new Cursor(this.measuredText, newOffset, 0)\r\n }\r\n\r\n down(): Cursor {\r\n const { line, column } = this.getPosition()\r\n if (line >= this.measuredText.lineCount - 1) {\r\n return new Cursor(this.measuredText, this.text.length, 0)\r\n }\r\n\r\n const newOffset = this.getOffset({ line: line + 1, column })\r\n return new Cursor(this.measuredText, newOffset, 0)\r\n }\r\n\r\n startOfLine(): Cursor {\r\n const { line } = this.getPosition()\r\n return new Cursor(\r\n this.measuredText,\r\n this.getOffset({\r\n line,\r\n column: 0,\r\n }),\r\n 0,\r\n )\r\n }\r\n\r\n endOfLine(): Cursor {\r\n const { line } = this.getPosition()\r\n const column = this.measuredText.getLineLength(line)\r\n const offset = this.getOffset({ line, column })\r\n return new Cursor(this.measuredText, offset, 0)\r\n }\r\n\r\n nextWord(): Cursor {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let nextCursor: Cursor = this\r\n while (nextCursor.isOverWordChar() && !nextCursor.isAtEnd()) {\r\n nextCursor = nextCursor.right()\r\n }\r\n while (!nextCursor.isOverWordChar() && !nextCursor.isAtEnd()) {\r\n nextCursor = nextCursor.right()\r\n }\r\n return nextCursor\r\n }\r\n\r\n prevWord(): Cursor {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let cursor: Cursor = this\r\n\r\n if (!cursor.left().isOverWordChar()) {\r\n cursor = cursor.left()\r\n }\r\n\r\n while (!cursor.isOverWordChar() && !cursor.isAtStart()) {\r\n cursor = cursor.left()\r\n }\r\n\r\n if (cursor.isOverWordChar()) {\r\n while (cursor.left().isOverWordChar() && !cursor.isAtStart()) {\r\n cursor = cursor.left()\r\n }\r\n }\r\n\r\n return cursor\r\n }\r\n\r\n private modifyText(end: Cursor, insertString: string = ''): Cursor {\r\n const startOffset = this.offset\r\n const endOffset = end.offset\r\n\r\n const newText =\r\n this.text.slice(0, startOffset) +\r\n insertString +\r\n this.text.slice(endOffset)\r\n\r\n return Cursor.fromText(\r\n newText,\r\n this.columns,\r\n startOffset + insertString.length,\r\n )\r\n }\r\n\r\n insert(insertString: string): Cursor {\r\n const newCursor = this.modifyText(this, insertString)\r\n return newCursor\r\n }\r\n\r\n del(): Cursor {\r\n if (this.isAtEnd()) {\r\n return this\r\n }\r\n return this.modifyText(this.right())\r\n }\r\n\r\n backspace(): Cursor {\r\n if (this.isAtStart()) {\r\n return this\r\n }\r\n\r\n const currentOffset = this.offset\r\n\r\n const leftCursor = this.left()\r\n const leftOffset = leftCursor.offset\r\n\r\n const newText =\r\n this.text.slice(0, leftOffset) + this.text.slice(currentOffset)\r\n\r\n return Cursor.fromText(newText, this.columns, leftOffset)\r\n }\r\n\r\n deleteToLineStart(): Cursor {\r\n return this.startOfLine().modifyText(this)\r\n }\r\n\r\n deleteToLineEnd(): Cursor {\r\n if (this.text[this.offset] === '\\n') {\r\n return this.modifyText(this.right())\r\n }\r\n\r\n return this.modifyText(this.endOfLine())\r\n }\r\n\r\n deleteWordBefore(): Cursor {\r\n if (this.isAtStart()) {\r\n return this\r\n }\r\n return this.prevWord().modifyText(this)\r\n }\r\n\r\n deleteWordAfter(): Cursor {\r\n if (this.isAtEnd()) {\r\n return this\r\n }\r\n\r\n return this.modifyText(this.nextWord())\r\n }\r\n\r\n private isOverWordChar(): boolean {\r\n const currentChar = this.text[this.offset] ?? ''\r\n return /\\w/.test(currentChar)\r\n }\r\n\r\n equals(other: Cursor): boolean {\r\n return (\r\n this.offset === other.offset && this.measuredText == other.measuredText\r\n )\r\n }\r\n\r\n private isAtStart(): boolean {\r\n return this.offset == 0\r\n }\r\n private isAtEnd(): boolean {\r\n return this.offset == this.text.length\r\n }\r\n\r\n public get text(): string {\r\n return this.measuredText.text\r\n }\r\n\r\n private get columns(): number {\r\n return this.measuredText.columns + 1\r\n }\r\n\r\n private getPosition(): Position {\r\n return this.measuredText.getPositionFromOffset(this.offset)\r\n }\r\n\r\n private getOffset(position: Position): number {\r\n return this.measuredText.getOffsetFromPosition(position)\r\n }\r\n}\r\n\r\nclass WrappedLine {\r\n constructor(\r\n public readonly text: string,\r\n public readonly startOffset: number,\r\n public readonly isPrecededByNewline: boolean,\r\n public readonly endsWithNewline: boolean = false,\r\n ) {}\r\n\r\n equals(other: WrappedLine): boolean {\r\n return this.text === other.text && this.startOffset === other.startOffset\r\n }\r\n\r\n get length(): number {\r\n return this.text.length + (this.endsWithNewline ? 1 : 0)\r\n }\r\n}\r\n\r\nexport class MeasuredText {\r\n private wrappedLines: WrappedLine[]\r\n\r\n constructor(\r\n readonly text: string,\r\n readonly columns: number,\r\n ) {\r\n this.wrappedLines = this.measureWrappedText()\r\n }\r\n\r\n private measureWrappedText(): WrappedLine[] {\r\n const wrappedText = wrapAnsi(this.text, this.columns, {\r\n hard: true,\r\n trim: false,\r\n })\r\n\r\n const wrappedLines: WrappedLine[] = []\r\n let searchOffset = 0\r\n let lastNewLinePos = -1\r\n\r\n const lines = wrappedText.split('\\n')\r\n for (let i = 0; i < lines.length; i++) {\r\n const text = lines[i]!\r\n const isPrecededByNewline = (startOffset: number) =>\r\n i == 0 || (startOffset > 0 && this.text[startOffset - 1] === '\\n')\r\n\r\n if (text.length === 0) {\r\n lastNewLinePos = this.text.indexOf('\\n', lastNewLinePos + 1)\r\n\r\n if (lastNewLinePos !== -1) {\r\n const startOffset = lastNewLinePos\r\n const endsWithNewline = true\r\n\r\n wrappedLines.push(\r\n new WrappedLine(\r\n text,\r\n startOffset,\r\n isPrecededByNewline(startOffset),\r\n endsWithNewline,\r\n ),\r\n )\r\n } else {\r\n const startOffset = this.text.length\r\n wrappedLines.push(\r\n new WrappedLine(\r\n text,\r\n startOffset,\r\n isPrecededByNewline(startOffset),\r\n false,\r\n ),\r\n )\r\n }\r\n } else {\r\n const startOffset = this.text.indexOf(text, searchOffset)\r\n if (startOffset === -1) {\r\n debugLogger.error('CURSOR_WRAP_MISMATCH', {\r\n currentText: text,\r\n originalText: this.text,\r\n searchOffset,\r\n wrappedText,\r\n })\r\n throw new Error('Failed to find wrapped line in original text')\r\n }\r\n\r\n searchOffset = startOffset + text.length\r\n\r\n const potentialNewlinePos = startOffset + text.length\r\n const endsWithNewline =\r\n potentialNewlinePos < this.text.length &&\r\n this.text[potentialNewlinePos] === '\\n'\r\n\r\n if (endsWithNewline) {\r\n lastNewLinePos = potentialNewlinePos\r\n }\r\n\r\n wrappedLines.push(\r\n new WrappedLine(\r\n text,\r\n startOffset,\r\n isPrecededByNewline(startOffset),\r\n endsWithNewline,\r\n ),\r\n )\r\n }\r\n }\r\n\r\n return wrappedLines\r\n }\r\n\r\n public getWrappedText(): WrappedText {\r\n return this.wrappedLines.map(line =>\r\n line.isPrecededByNewline ? line.text : line.text.trimStart(),\r\n )\r\n }\r\n\r\n private getLine(line: number): WrappedLine {\r\n return this.wrappedLines[\r\n Math.max(0, Math.min(line, this.wrappedLines.length - 1))\r\n ]!\r\n }\r\n\r\n public getOffsetFromPosition(position: Position): number {\r\n const wrappedLine = this.getLine(position.line)\r\n const startOffsetPlusColumn = wrappedLine.startOffset + position.column\r\n\r\n if (wrappedLine.text.length === 0 && wrappedLine.endsWithNewline) {\r\n return wrappedLine.startOffset\r\n }\r\n\r\n const lineEnd = wrappedLine.startOffset + wrappedLine.text.length\r\n const maxOffset = wrappedLine.endsWithNewline ? lineEnd + 1 : lineEnd\r\n\r\n return Math.min(startOffsetPlusColumn, maxOffset)\r\n }\r\n\r\n public getLineLength(line: number): number {\r\n const currentLine = this.getLine(line)\r\n const nextLine = this.getLine(line + 1)\r\n if (nextLine.equals(currentLine)) {\r\n return this.text.length - currentLine.startOffset\r\n }\r\n\r\n return nextLine.startOffset - currentLine.startOffset - 1\r\n }\r\n\r\n public getPositionFromOffset(offset: number): Position {\r\n const lines = this.wrappedLines\r\n for (let line = 0; line < lines.length; line++) {\r\n const currentLine = lines[line]!\r\n const nextLine = lines[line + 1]\r\n if (\r\n offset >= currentLine.startOffset &&\r\n (!nextLine || offset < nextLine.startOffset)\r\n ) {\r\n const leadingWhitepace = currentLine.isPrecededByNewline\r\n ? 0\r\n : currentLine.text.length - currentLine.text.trimStart().length\r\n const column = Math.max(\r\n 0,\r\n Math.min(\r\n offset - currentLine.startOffset - leadingWhitepace,\r\n currentLine.text.length,\r\n ),\r\n )\r\n return {\r\n line,\r\n column,\r\n }\r\n }\r\n }\r\n\r\n const line = lines.length - 1\r\n return {\r\n line,\r\n column: this.wrappedLines[line]!.text.length,\r\n }\r\n }\r\n\r\n public get lineCount(): number {\r\n return this.wrappedLines.length\r\n }\r\n equals(other: MeasuredText): boolean {\r\n return this.text === other.text && this.columns === other.columns\r\n }\r\n}\r\n", "import { execSync } from 'child_process'\r\nimport { readFileSync } from 'fs'\r\n\r\nconst SCREENSHOT_PATH = '/tmp/kode_cli_latest_screenshot.png'\r\n\r\nexport const CLIPBOARD_ERROR_MESSAGE =\r\n 'No image found in clipboard. Use Cmd + Ctrl + Shift + 4 to copy a screenshot to clipboard.'\r\n\r\nexport function getImageFromClipboard(): string | null {\r\n if (process.platform !== 'darwin') {\r\n return null\r\n }\r\n\r\n try {\r\n execSync(`osascript -e 'the clipboard as \u00ABclass PNGf\u00BB'`, {\r\n stdio: 'ignore',\r\n })\r\n\r\n execSync(\r\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'`,\r\n { stdio: 'ignore' },\r\n )\r\n\r\n const imageBuffer = readFileSync(SCREENSHOT_PATH)\r\n const base64Image = imageBuffer.toString('base64')\r\n\r\n execSync(`rm -f \"${SCREENSHOT_PATH}\"`, { stdio: 'ignore' })\r\n\r\n return base64Image\r\n } catch {\r\n return null\r\n }\r\n}\r\n", "import { Box, Text } from 'ink'\r\nimport React, { type ReactNode } from 'react'\r\nimport { SelectOption } from './select-option'\r\nimport { type Theme } from './theme'\r\nimport { useSelectState } from './use-select-state'\r\nimport { useSelect } from './use-select'\r\nimport { Option } from '@inkjs/ui'\r\nimport { getTheme } from '@utils/theme'\r\n\r\nexport type OptionSubtree = {\r\n readonly header?: string\r\n\r\n readonly options: (Option | OptionSubtree)[]\r\n}\r\n\r\nexport type OptionHeader = {\r\n readonly header: string\r\n\r\n readonly optionValues: string[]\r\n}\r\n\r\nexport const optionHeaderKey = (optionHeader: OptionHeader): string =>\r\n `HEADER-${optionHeader.optionValues.join(',')}`\r\n\r\nexport type SelectProps = {\r\n readonly isDisabled?: boolean\r\n\r\n readonly visibleOptionCount?: number\r\n\r\n readonly highlightText?: string\r\n\r\n readonly options: (Option | OptionSubtree)[]\r\n\r\n readonly defaultValue?: string\r\n\r\n readonly onChange?: (value: string) => void\r\n\r\n readonly onFocus?: (value: string) => void\r\n\r\n readonly focusValue?: string\r\n}\r\n\r\nexport function Select({\r\n isDisabled = false,\r\n visibleOptionCount = 5,\r\n highlightText,\r\n options,\r\n defaultValue,\r\n onChange,\r\n onFocus,\r\n focusValue,\r\n}: SelectProps) {\r\n const state = useSelectState({\r\n visibleOptionCount,\r\n options,\r\n defaultValue,\r\n onChange,\r\n onFocus,\r\n focusValue,\r\n })\r\n\r\n useSelect({ isDisabled, state })\r\n\r\n const appTheme = getTheme()\r\n const styles = {\r\n container: () => ({\r\n flexDirection: 'column' as const,\r\n }),\r\n highlightedText: () => ({\r\n color: appTheme.text,\r\n backgroundColor: appTheme.warning,\r\n }),\r\n }\r\n\r\n return (\r\n <Box {...styles.container()}>\r\n {state.visibleOptions.map(option => {\r\n const key = 'value' in option ? option.value : optionHeaderKey(option)\r\n const isFocused =\r\n !isDisabled &&\r\n state.focusedValue !== undefined &&\r\n ('value' in option\r\n ? state.focusedValue === option.value\r\n : option.optionValues.includes(state.focusedValue))\r\n const isSelected =\r\n !!state.value &&\r\n ('value' in option\r\n ? state.value === option.value\r\n : option.optionValues.includes(state.value))\r\n const smallPointer = 'header' in option\r\n const labelText = 'label' in option ? option.label : option.header\r\n let label: ReactNode = labelText\r\n\r\n if (highlightText && labelText.includes(highlightText)) {\r\n const index = labelText.indexOf(highlightText)\r\n\r\n label = (\r\n <>\r\n {labelText.slice(0, index)}\r\n <Text {...styles.highlightedText()}>{highlightText}</Text>\r\n {labelText.slice(index + highlightText.length)}\r\n </>\r\n )\r\n }\r\n\r\n return (\r\n <SelectOption\r\n key={key}\r\n isFocused={isFocused}\r\n isSelected={isSelected}\r\n smallPointer={smallPointer}\r\n children={label}\r\n />\r\n )\r\n })}\r\n </Box>\r\n )\r\n}\r\n", "import figures from 'figures'\r\nimport { Box, Text } from 'ink'\r\nimport React, { type ReactNode } from 'react'\r\nimport { type Theme } from './theme'\r\nimport { getTheme } from '@utils/theme'\r\n\r\nexport type SelectOptionProps = {\r\n readonly isFocused: boolean\r\n\r\n readonly isSelected: boolean\r\n\r\n readonly smallPointer?: boolean\r\n\r\n readonly children: ReactNode\r\n\r\n readonly key?: React.Key\r\n}\r\n\r\nexport function SelectOption({\r\n isFocused,\r\n isSelected,\r\n smallPointer,\r\n children,\r\n ...props\r\n}: SelectOptionProps) {\r\n const appTheme = getTheme()\r\n const styles = {\r\n option: ({ isFocused }: { isFocused: boolean }) => ({\r\n paddingLeft: 2,\r\n paddingRight: 1,\r\n }),\r\n focusIndicator: () => ({\r\n color: appTheme.newcraw,\r\n }),\r\n label: ({\r\n isFocused,\r\n isSelected,\r\n }: {\r\n isFocused: boolean\r\n isSelected: boolean\r\n }) => ({\r\n color: isSelected\r\n ? appTheme.success\r\n : isFocused\r\n ? appTheme.newcraw\r\n : appTheme.text,\r\n bold: isSelected,\r\n }),\r\n selectedIndicator: () => ({\r\n color: appTheme.success,\r\n }),\r\n }\r\n\r\n return (\r\n <Box {...styles.option({ isFocused })}>\r\n {isFocused && (\r\n <Text {...styles.focusIndicator()}>\r\n {smallPointer ? figures.triangleDownSmall : figures.pointer}\r\n </Text>\r\n )}\r\n\r\n <Text {...styles.label({ isFocused, isSelected })}>{children}</Text>\r\n\r\n {isSelected && (\r\n <Text {...styles.selectedIndicator()}>{figures.tick}</Text>\r\n )}\r\n </Box>\r\n )\r\n}\r\n", "import { isDeepStrictEqual } from 'node:util'\r\nimport {\r\n useReducer,\r\n type Reducer,\r\n useCallback,\r\n useMemo,\r\n useState,\r\n useEffect,\r\n} from 'react'\r\nimport OptionMap from './option-map'\r\nimport { Option } from '@inkjs/ui'\r\nimport type { OptionHeader, OptionSubtree } from './select'\r\n\r\ntype State = {\r\n optionMap: OptionMap\r\n\r\n visibleOptionCount: number\r\n\r\n focusedValue: string | undefined\r\n\r\n visibleFromIndex: number\r\n\r\n visibleToIndex: number\r\n\r\n previousValue: string | undefined\r\n\r\n value: string | undefined\r\n}\r\n\r\ntype Action =\r\n | FocusNextOptionAction\r\n | FocusPreviousOptionAction\r\n | SelectFocusedOptionAction\r\n | SetFocusAction\r\n | ResetAction\r\n\r\ntype SetFocusAction = {\r\n type: 'set-focus'\r\n value: string\r\n}\r\n\r\ntype FocusNextOptionAction = {\r\n type: 'focus-next-option'\r\n}\r\n\r\ntype FocusPreviousOptionAction = {\r\n type: 'focus-previous-option'\r\n}\r\n\r\ntype SelectFocusedOptionAction = {\r\n type: 'select-focused-option'\r\n}\r\n\r\ntype ResetAction = {\r\n type: 'reset'\r\n state: State\r\n}\r\n\r\nconst reducer: Reducer<State, Action> = (state, action) => {\r\n switch (action.type) {\r\n case 'focus-next-option': {\r\n if (!state.focusedValue) {\r\n return state\r\n }\r\n\r\n const item = state.optionMap.get(state.focusedValue)\r\n\r\n if (!item) {\r\n return state\r\n }\r\n\r\n let next = item.next\r\n while (next && !('value' in next)) {\r\n next = next.next\r\n }\r\n\r\n if (!next) {\r\n return state\r\n }\r\n\r\n const needsToScroll = next.index >= state.visibleToIndex\r\n\r\n if (!needsToScroll) {\r\n return {\r\n ...state,\r\n focusedValue: next.value,\r\n }\r\n }\r\n\r\n const nextVisibleToIndex = Math.min(\r\n state.optionMap.size,\r\n state.visibleToIndex + 1,\r\n )\r\n\r\n const nextVisibleFromIndex = nextVisibleToIndex - state.visibleOptionCount\r\n\r\n return {\r\n ...state,\r\n focusedValue: next.value,\r\n visibleFromIndex: nextVisibleFromIndex,\r\n visibleToIndex: nextVisibleToIndex,\r\n }\r\n }\r\n\r\n case 'focus-previous-option': {\r\n if (!state.focusedValue) {\r\n return state\r\n }\r\n\r\n const item = state.optionMap.get(state.focusedValue)\r\n\r\n if (!item) {\r\n return state\r\n }\r\n\r\n let previous = item.previous\r\n while (previous && !('value' in previous)) {\r\n previous = previous.previous\r\n }\r\n\r\n if (!previous) {\r\n return state\r\n }\r\n\r\n const needsToScroll = previous.index <= state.visibleFromIndex\r\n\r\n if (!needsToScroll) {\r\n return {\r\n ...state,\r\n focusedValue: previous.value,\r\n }\r\n }\r\n\r\n const nextVisibleFromIndex = Math.max(0, state.visibleFromIndex - 1)\r\n\r\n const nextVisibleToIndex = nextVisibleFromIndex + state.visibleOptionCount\r\n\r\n return {\r\n ...state,\r\n focusedValue: previous.value,\r\n visibleFromIndex: nextVisibleFromIndex,\r\n visibleToIndex: nextVisibleToIndex,\r\n }\r\n }\r\n\r\n case 'select-focused-option': {\r\n return {\r\n ...state,\r\n previousValue: state.value,\r\n value: state.focusedValue,\r\n }\r\n }\r\n\r\n case 'reset': {\r\n return action.state\r\n }\r\n\r\n case 'set-focus': {\r\n return {\r\n ...state,\r\n focusedValue: action.value,\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport type UseSelectStateProps = {\r\n visibleOptionCount?: number\r\n\r\n options: (Option | OptionSubtree)[]\r\n\r\n defaultValue?: string\r\n\r\n onChange?: (value: string) => void\r\n\r\n onFocus?: (value: string) => void\r\n\r\n focusValue?: string\r\n}\r\n\r\nexport type SelectState = Pick<\r\n State,\r\n 'focusedValue' | 'visibleFromIndex' | 'visibleToIndex' | 'value'\r\n> & {\r\n visibleOptions: Array<(Option | OptionHeader) & { index: number }>\r\n\r\n focusNextOption: () => void\r\n\r\n focusPreviousOption: () => void\r\n\r\n selectFocusedOption: () => void\r\n}\r\n\r\nconst flattenOptions = (\r\n options: (Option | OptionSubtree)[],\r\n): (Option | OptionHeader)[] =>\r\n options.flatMap(option => {\r\n if ('options' in option) {\r\n const flatSubtree = flattenOptions(option.options)\r\n const optionValues = flatSubtree.flatMap(o =>\r\n 'value' in o ? o.value : [],\r\n )\r\n const header =\r\n option.header !== undefined\r\n ? [{ header: option.header, optionValues }]\r\n : []\r\n\r\n return [...header, ...flatSubtree]\r\n }\r\n return option\r\n })\r\n\r\nconst createDefaultState = ({\r\n visibleOptionCount: customVisibleOptionCount,\r\n defaultValue,\r\n options,\r\n}: Pick<\r\n UseSelectStateProps,\r\n 'visibleOptionCount' | 'defaultValue' | 'options'\r\n>) => {\r\n const flatOptions = flattenOptions(options)\r\n\r\n const visibleOptionCount =\r\n typeof customVisibleOptionCount === 'number'\r\n ? Math.min(customVisibleOptionCount, flatOptions.length)\r\n : flatOptions.length\r\n\r\n const optionMap = new OptionMap(flatOptions)\r\n const firstOption = optionMap.first\r\n\r\n let focusedValue: string | undefined\r\n if (defaultValue && optionMap.get(defaultValue)) {\r\n focusedValue = defaultValue\r\n } else {\r\n focusedValue =\r\n firstOption && 'value' in firstOption ? firstOption.value : undefined\r\n }\r\n\r\n let visibleFromIndex = 0\r\n let visibleToIndex = visibleOptionCount\r\n\r\n if (focusedValue && optionMap.get(focusedValue)) {\r\n const focusedIndex = optionMap.get(focusedValue)!.index\r\n const halfVisible = Math.floor(visibleOptionCount / 2)\r\n visibleFromIndex = Math.max(0, focusedIndex - halfVisible)\r\n visibleToIndex = Math.min(\r\n flatOptions.length,\r\n visibleFromIndex + visibleOptionCount,\r\n )\r\n\r\n if (visibleToIndex - visibleFromIndex < visibleOptionCount) {\r\n visibleFromIndex = Math.max(0, visibleToIndex - visibleOptionCount)\r\n }\r\n }\r\n\r\n return {\r\n optionMap,\r\n visibleOptionCount,\r\n focusedValue,\r\n visibleFromIndex,\r\n visibleToIndex,\r\n previousValue: defaultValue,\r\n value: defaultValue,\r\n }\r\n}\r\n\r\nexport const useSelectState = ({\r\n visibleOptionCount = 5,\r\n options,\r\n defaultValue,\r\n onChange,\r\n onFocus,\r\n focusValue,\r\n}: UseSelectStateProps) => {\r\n const flatOptions = flattenOptions(options)\r\n\r\n const [state, dispatch] = useReducer(\r\n reducer,\r\n { visibleOptionCount, defaultValue, options },\r\n createDefaultState,\r\n )\r\n\r\n const [lastOptions, setLastOptions] = useState(flatOptions)\r\n\r\n if (\r\n flatOptions !== lastOptions &&\r\n !isDeepStrictEqual(flatOptions, lastOptions)\r\n ) {\r\n dispatch({\r\n type: 'reset',\r\n state: createDefaultState({ visibleOptionCount, defaultValue, options }),\r\n })\r\n\r\n setLastOptions(flatOptions)\r\n }\r\n\r\n const focusNextOption = useCallback(() => {\r\n dispatch({\r\n type: 'focus-next-option',\r\n })\r\n }, [])\r\n\r\n const focusPreviousOption = useCallback(() => {\r\n dispatch({\r\n type: 'focus-previous-option',\r\n })\r\n }, [])\r\n\r\n const selectFocusedOption = useCallback(() => {\r\n dispatch({\r\n type: 'select-focused-option',\r\n })\r\n }, [])\r\n\r\n const visibleOptions = useMemo(() => {\r\n return flatOptions\r\n .map((option, index) => ({\r\n ...option,\r\n index,\r\n }))\r\n .slice(state.visibleFromIndex, state.visibleToIndex)\r\n }, [flatOptions, state.visibleFromIndex, state.visibleToIndex])\r\n\r\n useEffect(() => {\r\n if (state.value && state.previousValue !== state.value) {\r\n onChange?.(state.value)\r\n }\r\n }, [state.previousValue, state.value, options, onChange])\r\n\r\n useEffect(() => {\r\n if (state.focusedValue) {\r\n onFocus?.(state.focusedValue)\r\n }\r\n }, [state.focusedValue, onFocus])\r\n\r\n useEffect(() => {\r\n if (focusValue) {\r\n dispatch({\r\n type: 'set-focus',\r\n value: focusValue,\r\n })\r\n }\r\n }, [focusValue])\r\n\r\n return {\r\n focusedValue: state.focusedValue,\r\n visibleFromIndex: state.visibleFromIndex,\r\n visibleToIndex: state.visibleToIndex,\r\n value: state.value,\r\n visibleOptions,\r\n focusNextOption,\r\n focusPreviousOption,\r\n selectFocusedOption,\r\n }\r\n}\r\n", "import { type Option } from '@inkjs/ui'\r\nimport { optionHeaderKey, type OptionHeader } from './select'\r\n\r\ntype OptionMapItem = (Option | OptionHeader) & {\r\n previous: OptionMapItem | undefined\r\n next: OptionMapItem | undefined\r\n index: number\r\n}\r\n\r\nexport default class OptionMap extends Map<string, OptionMapItem> {\r\n readonly first: OptionMapItem | undefined\r\n\r\n constructor(options: (Option | OptionHeader)[]) {\r\n const items: Array<[string, OptionMapItem]> = []\r\n let firstItem: OptionMapItem | undefined\r\n let previous: OptionMapItem | undefined\r\n let index = 0\r\n\r\n for (const option of options) {\r\n const item = {\r\n ...option,\r\n previous,\r\n next: undefined,\r\n index,\r\n }\r\n\r\n if (previous) {\r\n previous.next = item\r\n }\r\n\r\n firstItem ||= item\r\n\r\n const key = 'value' in option ? option.value : optionHeaderKey(option)\r\n items.push([key, item])\r\n index++\r\n previous = item\r\n }\r\n\r\n super(items)\r\n this.first = firstItem\r\n }\r\n}\r\n", "import { useInput } from 'ink'\r\nimport { type SelectState } from './use-select-state'\r\n\r\nexport type UseSelectProps = {\r\n isDisabled?: boolean\r\n\r\n state: SelectState\r\n}\r\n\r\nexport const useSelect = ({ isDisabled = false, state }: UseSelectProps) => {\r\n useInput(\r\n (_input, key) => {\r\n if (key.downArrow) {\r\n state.focusNextOption()\r\n }\r\n\r\n if (key.upArrow) {\r\n state.focusPreviousOption()\r\n }\r\n\r\n if (key.return) {\r\n state.selectFocusedOption()\r\n }\r\n },\r\n { isActive: !isDisabled },\r\n )\r\n}\r\n", "import { Box, Text } from 'ink'\r\nimport * as React from 'react'\r\nimport { Hunk } from 'diff'\r\nimport { getTheme, ThemeNames } from '@utils/theme'\r\nimport { useMemo } from 'react'\r\nimport { wrapText } from '@utils/terminal/format'\r\n\r\ntype Props = {\r\n patch: Hunk\r\n dim: boolean\r\n width: number\r\n overrideTheme?: ThemeNames\r\n key?: React.Key\r\n}\r\n\r\nexport function StructuredDiff({\r\n patch,\r\n dim,\r\n width,\r\n overrideTheme,\r\n}: Props): React.ReactNode {\r\n const diff = useMemo(\r\n () => formatDiff(patch.lines, patch.oldStart, width, dim, overrideTheme),\r\n [patch.lines, patch.oldStart, width, dim, overrideTheme],\r\n )\r\n\r\n return diff.map((_, i) => <Box key={i}>{_}</Box>)\r\n}\r\n\r\nfunction formatDiff(\r\n lines: string[],\r\n startingLineNumber: number,\r\n width: number,\r\n dim: boolean,\r\n overrideTheme?: ThemeNames,\r\n): React.ReactNode[] {\r\n const theme = getTheme(overrideTheme)\r\n\r\n const ls = numberDiffLines(\r\n lines.map(code => {\r\n if (code.startsWith('+')) {\r\n return {\r\n code: ' ' + code.slice(1),\r\n i: 0,\r\n type: 'add',\r\n }\r\n }\r\n if (code.startsWith('-')) {\r\n return {\r\n code: ' ' + code.slice(1),\r\n i: 0,\r\n type: 'remove',\r\n }\r\n }\r\n return { code, i: 0, type: 'nochange' }\r\n }),\r\n startingLineNumber,\r\n )\r\n\r\n const maxLineNumber = Math.max(...ls.map(({ i }) => i))\r\n const maxWidth = maxLineNumber.toString().length\r\n\r\n return ls.flatMap(({ type, code, i }) => {\r\n const wrappedLines = wrapText(code, width - maxWidth)\r\n return wrappedLines.map((line, lineIndex) => {\r\n const key = `${type}-${i}-${lineIndex}`\r\n switch (type) {\r\n case 'add':\r\n return (\r\n <React.Fragment key={key}>\r\n <Text>\r\n <LineNumber\r\n i={lineIndex === 0 ? i : undefined}\r\n width={maxWidth}\r\n />\r\n <Text\r\n color={overrideTheme ? theme.text : undefined}\r\n backgroundColor={\r\n dim ? theme.diff.addedDimmed : theme.diff.added\r\n }\r\n dimColor={dim}\r\n >\r\n {line}\r\n </Text>\r\n </Text>\r\n </React.Fragment>\r\n )\r\n case 'remove':\r\n return (\r\n <React.Fragment key={key}>\r\n <Text>\r\n <LineNumber\r\n i={lineIndex === 0 ? i : undefined}\r\n width={maxWidth}\r\n />\r\n <Text\r\n color={overrideTheme ? theme.text : undefined}\r\n backgroundColor={\r\n dim ? theme.diff.removedDimmed : theme.diff.removed\r\n }\r\n dimColor={dim}\r\n >\r\n {line}\r\n </Text>\r\n </Text>\r\n </React.Fragment>\r\n )\r\n case 'nochange':\r\n return (\r\n <React.Fragment key={key}>\r\n <Text>\r\n <LineNumber\r\n i={lineIndex === 0 ? i : undefined}\r\n width={maxWidth}\r\n />\r\n <Text\r\n color={overrideTheme ? theme.text : undefined}\r\n dimColor={dim}\r\n >\r\n {line}\r\n </Text>\r\n </Text>\r\n </React.Fragment>\r\n )\r\n }\r\n })\r\n })\r\n}\r\n\r\nfunction LineNumber({\r\n i,\r\n width,\r\n}: {\r\n i: number | undefined\r\n width: number\r\n}): React.ReactNode {\r\n return (\r\n <Text color={getTheme().secondaryText}>\r\n {i !== undefined ? i.toString().padStart(width) : ' '.repeat(width)}{' '}\r\n </Text>\r\n )\r\n}\r\n\r\nfunction numberDiffLines(\r\n diff: { code: string; type: string }[],\r\n startLine: number,\r\n): { code: string; type: string; i: number }[] {\r\n let i = startLine\r\n const result: { code: string; type: string; i: number }[] = []\r\n const queue = [...diff]\r\n\r\n while (queue.length > 0) {\r\n const { code, type } = queue.shift()!\r\n const line = {\r\n code: code,\r\n type,\r\n i,\r\n }\r\n\r\n switch (type) {\r\n case 'nochange':\r\n i++\r\n result.push(line)\r\n break\r\n case 'add':\r\n i++\r\n result.push(line)\r\n break\r\n case 'remove': {\r\n result.push(line)\r\n let numRemoved = 0\r\n while (queue[0]?.type === 'remove') {\r\n i++\r\n const { code, type } = queue.shift()!\r\n const line = {\r\n code: code,\r\n type,\r\n i,\r\n }\r\n result.push(line)\r\n numRemoved++\r\n }\r\n i -= numRemoved\r\n break\r\n }\r\n }\r\n }\r\n\r\n return result\r\n}\r\n", "import { dirname, isAbsolute, resolve, relative } from 'path'\r\nimport { statSync } from 'fs'\r\nimport { getCwd, getOriginalCwd } from '@utils/state'\r\nimport { isMainPlanFilePathForActiveConversation } from '@utils/plan/planMode'\r\n\r\nconst readFileAllowedDirectories: Set<string> = new Set()\r\nconst writeFileAllowedDirectories: Set<string> = new Set()\r\n\r\nexport function toAbsolutePath(path: string): string {\r\n const abs = isAbsolute(path) ? resolve(path) : resolve(getCwd(), path)\r\n return normalizeForCompare(abs)\r\n}\r\n\r\nfunction normalizeForCompare(p: string): string {\r\n const norm = resolve(p)\r\n return process.platform === 'win32' ? norm.toLowerCase() : norm\r\n}\r\n\r\nfunction isSubpath(base: string, target: string): boolean {\r\n const rel = relative(base, target)\r\n if (!rel || rel === '') return true\r\n if (rel.startsWith('..')) return false\r\n if (isAbsolute(rel)) return false\r\n return true\r\n}\r\n\r\nfunction pathToPermissionDirectory(path: string): string {\r\n try {\r\n const stats = statSync(path)\r\n if (stats.isDirectory()) return path\r\n } catch {\r\n }\r\n return dirname(path)\r\n}\r\n\r\nexport function pathInOriginalCwd(path: string): boolean {\r\n const absolutePath = toAbsolutePath(path)\r\n const base = toAbsolutePath(getOriginalCwd())\r\n return isSubpath(base, absolutePath)\r\n}\r\n\r\nexport function hasReadPermission(directory: string): boolean {\r\n if (isMainPlanFilePathForActiveConversation(directory)) return true\r\n const absolutePath = toAbsolutePath(directory)\r\n for (const allowedPath of readFileAllowedDirectories) {\r\n if (isSubpath(allowedPath, absolutePath)) return true\r\n }\r\n return false\r\n}\r\n\r\nexport function hasWritePermission(directory: string): boolean {\r\n if (isMainPlanFilePathForActiveConversation(directory)) return true\r\n const absolutePath = toAbsolutePath(directory)\r\n for (const allowedPath of writeFileAllowedDirectories) {\r\n if (isSubpath(allowedPath, absolutePath)) return true\r\n }\r\n return false\r\n}\r\n\r\nfunction saveReadPermission(directory: string): void {\r\n const absolutePath = toAbsolutePath(directory)\r\n for (const allowedPath of Array.from(readFileAllowedDirectories)) {\r\n if (isSubpath(absolutePath, allowedPath)) {\r\n readFileAllowedDirectories.delete(allowedPath)\r\n }\r\n }\r\n readFileAllowedDirectories.add(absolutePath)\r\n}\r\n\r\nexport const saveReadPermissionForTest = saveReadPermission\r\n\r\nexport function grantReadPermissionForOriginalDir(): void {\r\n const originalProjectDir = getOriginalCwd()\r\n saveReadPermission(originalProjectDir)\r\n}\r\n\r\nexport function grantReadPermissionForPath(path: string): void {\r\n const absolutePath = toAbsolutePath(path)\r\n saveReadPermission(pathToPermissionDirectory(absolutePath))\r\n}\r\n\r\nfunction saveWritePermission(directory: string): void {\r\n const absolutePath = toAbsolutePath(directory)\r\n for (const allowedPath of Array.from(writeFileAllowedDirectories)) {\r\n if (isSubpath(absolutePath, allowedPath)) {\r\n writeFileAllowedDirectories.delete(allowedPath)\r\n }\r\n }\r\n writeFileAllowedDirectories.add(absolutePath)\r\n}\r\n\r\nexport function grantWritePermissionForOriginalDir(): void {\r\n const originalProjectDir = getOriginalCwd()\r\n saveWritePermission(originalProjectDir)\r\n}\r\n\r\nexport function grantWritePermissionForPath(path: string): void {\r\n const absolutePath = toAbsolutePath(path)\r\n saveWritePermission(pathToPermissionDirectory(absolutePath))\r\n}\r\n\r\nexport function clearFilePermissions(): void {\r\n readFileAllowedDirectories.clear()\r\n writeFileAllowedDirectories.clear()\r\n}\r\n", "import { useInput } from 'ink'\r\nimport { useDoublePress } from './useDoublePress'\r\nimport { useState } from 'react'\r\n\r\ntype ExitState = {\r\n pending: boolean\r\n keyName: 'Ctrl-C' | 'Ctrl-D' | null\r\n}\r\n\r\nexport function useExitOnCtrlCD(onExit: () => void): ExitState {\r\n const [exitState, setExitState] = useState<ExitState>({\r\n pending: false,\r\n keyName: null,\r\n })\r\n\r\n const handleCtrlC = useDoublePress(\r\n pending => setExitState({ pending, keyName: 'Ctrl-C' }),\r\n onExit,\r\n )\r\n const handleCtrlD = useDoublePress(\r\n pending => setExitState({ pending, keyName: 'Ctrl-D' }),\r\n onExit,\r\n )\r\n\r\n useInput((input, key) => {\r\n if (key.ctrl && input === 'c') handleCtrlC()\r\n if (key.ctrl && input === 'd') handleCtrlD()\r\n })\r\n\r\n return exitState\r\n}\r\n", "import React, { useState } from 'react'\r\nimport { PRODUCT_NAME } from '@constants/product'\r\nimport { Box, Newline, Text, useInput } from 'ink'\r\nimport {\r\n getGlobalConfig,\r\n saveGlobalConfig,\r\n DEFAULT_GLOBAL_CONFIG,\r\n ProviderType,\r\n} from '@utils/config'\r\nimport { OrderedList } from '@inkjs/ui'\r\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\r\nimport { MIN_LOGO_WIDTH } from './Logo'\r\nimport { Select } from './custom-select/select'\r\nimport { StructuredDiff } from './StructuredDiff'\r\nimport { getTheme, type ThemeNames } from '@utils/theme'\r\nimport { clearTerminal } from '@utils/terminal'\r\nimport { PressEnterToContinue } from './PressEnterToContinue'\r\nimport { ModelSelector } from './ModelSelector'\r\ntype StepId = 'theme' | 'usage' | 'providers' | 'model'\r\n\r\ninterface OnboardingStep {\r\n id: StepId\r\n component: React.ReactNode\r\n}\r\n\r\ntype Props = {\r\n onDone(): void\r\n}\r\n\r\nexport function Onboarding({ onDone }: Props): React.ReactNode {\r\n const [currentStepIndex, setCurrentStepIndex] = useState(0)\r\n const [showModelSelector, setShowModelSelector] = useState(false)\r\n const config = getGlobalConfig()\r\n\r\n const [selectedTheme, setSelectedTheme] = useState(\r\n DEFAULT_GLOBAL_CONFIG.theme,\r\n )\r\n const theme = getTheme()\r\n function goToNextStep() {\r\n if (currentStepIndex < steps.length - 1) {\r\n const nextIndex = currentStepIndex + 1\r\n setCurrentStepIndex(nextIndex)\r\n }\r\n }\r\n\r\n function handleThemeSelection(newTheme: string) {\r\n saveGlobalConfig({\r\n ...config,\r\n theme: newTheme as ThemeNames,\r\n })\r\n goToNextStep()\r\n }\r\n\r\n function handleThemePreview(newTheme: string) {\r\n setSelectedTheme(newTheme as ThemeNames)\r\n }\r\n\r\n function handleProviderSelectionDone() {\r\n goToNextStep()\r\n }\r\n\r\n function handleModelSelectionDone() {\r\n onDone()\r\n }\r\n\r\n const exitState = useExitOnCtrlCD(() => process.exit(0))\r\n\r\n useInput(\r\n async (_, key) => {\r\n const currentStep = steps[currentStepIndex]\r\n if (\r\n key.return &&\r\n currentStep &&\r\n ['usage', 'providers', 'model'].includes(currentStep.id)\r\n ) {\r\n if (currentStep.id === 'model') {\r\n setShowModelSelector(true)\r\n } else if (currentStepIndex === steps.length - 1) {\r\n onDone()\r\n } else {\r\n await clearTerminal()\r\n goToNextStep()\r\n }\r\n }\r\n },\r\n { isActive: !showModelSelector },\r\n )\r\n\r\n const themeStep = (\r\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\r\n <Text>Let&apos;s get started.</Text>\r\n <Box flexDirection=\"column\">\r\n <Text bold>Choose the option that looks best when you select it:</Text>\r\n <Text dimColor>To change this later, run /config</Text>\r\n </Box>\r\n <Select\r\n options={[\r\n { label: 'Light text', value: 'dark' },\r\n { label: 'Dark text', value: 'light' },\r\n {\r\n label: 'Light text (colorblind-friendly)',\r\n value: 'dark-daltonized',\r\n },\r\n {\r\n label: 'Dark text (colorblind-friendly)',\r\n value: 'light-daltonized',\r\n },\r\n ]}\r\n onFocus={handleThemePreview}\r\n onChange={handleThemeSelection}\r\n />\r\n <Box flexDirection=\"column\">\r\n <Box\r\n paddingLeft={1}\r\n marginRight={1}\r\n borderStyle=\"round\"\r\n borderColor=\"gray\"\r\n flexDirection=\"column\"\r\n >\r\n <StructuredDiff\r\n patch={{\r\n oldStart: 1,\r\n newStart: 1,\r\n oldLines: 3,\r\n newLines: 3,\r\n lines: [\r\n 'function greet() {',\r\n '- console.log(\"Hello, World!\");',\r\n '+ console.log(\"Hello, anon!\");',\r\n '}',\r\n ],\r\n }}\r\n dim={false}\r\n width={40}\r\n overrideTheme={selectedTheme}\r\n />\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n\r\n const providersStep = (\r\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n Next, let's select your preferred AI provider and model.\r\n </Text>\r\n </Box>\r\n <ModelSelector\r\n onDone={handleProviderSelectionDone}\r\n skipModelType={true}\r\n isOnboarding={true}\r\n />\r\n </Box>\r\n )\r\n\r\n const usageStep = (\r\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\r\n <Text bold>Using {PRODUCT_NAME} effectively:</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <OrderedList children={[]}>\r\n <OrderedList.Item children={[]}>\r\n <Text>\r\n Start in your project directory\r\n <Newline />\r\n <Text color={theme.secondaryText}>\r\n Files are automatically added to context when needed.\r\n </Text>\r\n <Newline />\r\n </Text>\r\n </OrderedList.Item>\r\n <OrderedList.Item children={[]}>\r\n <Text>\r\n Use {PRODUCT_NAME} as a development partner\r\n <Newline />\r\n <Text color={theme.secondaryText}>\r\n Get help with file analysis, editing, bash commands,\r\n <Newline />\r\n and git history.\r\n <Newline />\r\n </Text>\r\n </Text>\r\n </OrderedList.Item>\r\n <OrderedList.Item children={[]}>\r\n <Text>\r\n Provide clear context\r\n <Newline />\r\n <Text color={theme.secondaryText}>\r\n Be as specific as you would with another engineer. <Newline />\r\n The better the context, the better the results. <Newline />\r\n </Text>\r\n </Text>\r\n </OrderedList.Item>\r\n </OrderedList>\r\n </Box>\r\n <PressEnterToContinue />\r\n </Box>\r\n )\r\n\r\n const modelStep = (\r\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\r\n <Text bold>Configure your models:</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text>\r\n You can customize which models {PRODUCT_NAME} uses for different\r\n tasks.\r\n <Newline />\r\n <Text color={theme.secondaryText}>\r\n Let's set up your preferred models for large and small tasks.\r\n </Text>\r\n </Text>\r\n <Box marginTop={1}>\r\n <Text>\r\n Press <Text color={theme.suggestion}>Enter</Text> to continue to the\r\n model selection screen.\r\n </Text>\r\n </Box>\r\n </Box>\r\n <PressEnterToContinue />\r\n </Box>\r\n )\r\n\r\n const steps: OnboardingStep[] = []\r\n steps.push({ id: 'theme', component: themeStep })\r\n steps.push({ id: 'usage', component: usageStep })\r\n\r\n steps.push({ id: 'model', component: modelStep })\r\n\r\n if (showModelSelector) {\r\n return (\r\n <ModelSelector\r\n onDone={handleModelSelectionDone}\r\n skipModelType={true}\r\n isOnboarding={true}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>\r\n {PRODUCT_NAME}{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n {steps[currentStepIndex]?.component}\r\n </Box>\r\n </>\r\n </Box>\r\n )\r\n}\r\n\r\nexport function WelcomeBox(): React.ReactNode {\r\n const theme = getTheme()\r\n return (\r\n <Box\r\n borderColor={theme.newcraw}\r\n borderStyle=\"round\"\r\n paddingX={1}\r\n width={MIN_LOGO_WIDTH}\r\n >\r\n <Text>\r\n <Text color={theme.newcraw}>\u273B</Text> Welcome to{' '}\r\n <Text bold>{PRODUCT_NAME}</Text> research preview!\r\n </Text>\r\n </Box>\r\n )\r\n}\r\n", "import * as React from 'react'\r\nimport { getTheme } from '@utils/theme'\r\nimport { Text } from 'ink'\r\n\r\nexport function PressEnterToContinue(): React.ReactNode {\r\n return (\r\n <Text color={getTheme().permission}>\r\n Press <Text bold>Enter</Text> to continue\u2026\r\n </Text>\r\n )\r\n}\r\n", "import React, { useCallback, useEffect, useMemo, useState } from 'react'\r\nimport { Box, Newline, Text, useInput, useStdout } from 'ink'\r\nimport OpenAI from 'openai'\r\nimport figures from 'figures'\r\n\r\nimport models, { providers } from '@constants/models'\r\nimport { PRODUCT_NAME } from '@constants/product'\r\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\r\nimport { verifyApiKey } from '@services/llmLazy'\r\nimport {\r\n testGPT5Connection,\r\n validateGPT5Config,\r\n} from '@services/gpt5ConnectionTest'\r\nimport {\r\n getGlobalConfig,\r\n ModelPointerType,\r\n ProviderType,\r\n saveGlobalConfig,\r\n setAllPointersToModel,\r\n setModelPointer,\r\n} from '@utils/config'\r\nimport { getModelManager } from '@utils/model'\r\nimport { getTheme } from '@utils/theme'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\n\r\nimport { CardNavigator, useCardNavigation } from '../CardNavigator'\r\nimport { Select } from '../custom-select/select'\r\nimport { ScreenContainer } from './ScreenContainer'\r\nimport {\r\n CONTEXT_LENGTH_OPTIONS,\r\n DEFAULT_CONTEXT_LENGTH,\r\n DEFAULT_MAX_TOKENS,\r\n MAX_TOKENS_OPTIONS,\r\n REASONING_EFFORT_OPTIONS,\r\n ReasoningEffortOption,\r\n} from './options'\r\nimport { printModelConfig } from './printModelConfig'\r\nimport type { ModelInfo } from './types'\r\nimport { useEscapeNavigation } from './useEscapeNavigation'\r\nimport * as modelFetchers from './modelFetchers'\r\nimport TextInput from '../TextInput'\r\nimport { ModelSelectionScreen } from './ModelSelectionScreen'\r\n\r\ntype WindowedOptionsProps = {\r\n options: Array<{ value: string; label: string }>\r\n focusedIndex: number\r\n maxVisible: number\r\n theme: ReturnType<typeof getTheme>\r\n}\r\n\r\nconst WindowedOptions = React.memo(function WindowedOptions({\r\n options,\r\n focusedIndex,\r\n maxVisible,\r\n theme,\r\n}: WindowedOptionsProps) {\r\n if (options.length === 0) {\r\n return <Text color={theme.secondaryText}>No options available.</Text>\r\n }\r\n\r\n const visibleCount = Math.max(1, Math.min(maxVisible, options.length))\r\n const half = Math.floor(visibleCount / 2)\r\n const start = Math.max(\r\n 0,\r\n Math.min(focusedIndex - half, Math.max(0, options.length - visibleCount)),\r\n )\r\n const end = Math.min(options.length, start + visibleCount)\r\n const showUp = start > 0\r\n const showDown = end < options.length\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={0}>\r\n {showUp && (\r\n <Text color={theme.secondaryText}>{figures.arrowUp} More</Text>\r\n )}\r\n {options.slice(start, end).map((opt, idx) => {\r\n const absoluteIndex = start + idx\r\n const isFocused = absoluteIndex === focusedIndex\r\n return (\r\n <Box key={opt.value} flexDirection=\"row\">\r\n <Text color={isFocused ? theme.newcraw : theme.secondaryText}>\r\n {isFocused ? figures.pointer : ' '}\r\n </Text>\r\n <Text\r\n color={isFocused ? theme.text : theme.secondaryText}\r\n bold={isFocused}\r\n >\r\n {' '}\r\n {opt.label}\r\n </Text>\r\n </Box>\r\n )\r\n })}\r\n {showDown && (\r\n <Text color={theme.secondaryText}>{figures.arrowDown} More</Text>\r\n )}\r\n </Box>\r\n )\r\n})\r\n\r\ntype Props = {\r\n onDone: () => void\r\n abortController?: AbortController\r\n targetPointer?: ModelPointerType\r\n isOnboarding?: boolean\r\n onCancel?: () => void\r\n skipModelType?: boolean\r\n}\r\n\r\nexport function ModelSelector({\r\n onDone: onDoneProp,\r\n abortController,\r\n targetPointer,\r\n isOnboarding = false,\r\n onCancel,\r\n skipModelType = false,\r\n}: Props): React.ReactNode {\r\n const config = getGlobalConfig()\r\n const theme = getTheme()\r\n const { stdout } = useStdout()\r\n const terminalRows = stdout?.rows ?? 24\r\n const compactLayout = terminalRows <= 22\r\n const tightLayout = terminalRows <= 18\r\n const containerPaddingY = tightLayout ? 0 : compactLayout ? 0 : 1\r\n const containerGap = tightLayout ? 0 : 1\r\n const onDone = () => {\r\n printModelConfig()\r\n onDoneProp()\r\n }\r\n const exitState = useExitOnCtrlCD(() => process.exit(0))\r\n\r\n const getInitialScreen = (): string => {\r\n return 'provider'\r\n }\r\n\r\n const [screenStack, setScreenStack] = useState<\r\n Array<\r\n | 'provider'\r\n | 'partnerProviders'\r\n | 'partnerCodingPlans'\r\n | 'apiKey'\r\n | 'resourceName'\r\n | 'baseUrl'\r\n | 'model'\r\n | 'modelInput'\r\n | 'modelParams'\r\n | 'contextLength'\r\n | 'connectionTest'\r\n | 'confirmation'\r\n >\r\n >([getInitialScreen()])\r\n\r\n const currentScreen = screenStack[screenStack.length - 1]\r\n\r\n const navigateTo = (\r\n screen:\r\n | 'provider'\r\n | 'partnerProviders'\r\n | 'partnerCodingPlans'\r\n | 'apiKey'\r\n | 'resourceName'\r\n | 'baseUrl'\r\n | 'model'\r\n | 'modelInput'\r\n | 'modelParams'\r\n | 'contextLength'\r\n | 'connectionTest'\r\n | 'confirmation',\r\n ) => {\r\n setScreenStack(prev => [...prev, screen])\r\n }\r\n\r\n const goBack = () => {\r\n if (screenStack.length > 1) {\r\n setScreenStack(prev => prev.slice(0, -1))\r\n } else {\r\n onDone()\r\n }\r\n }\r\n\r\n const [selectedProvider, setSelectedProvider] = useState<ProviderType>(\r\n config.primaryProvider ?? 'anthropic',\r\n )\r\n\r\n const [selectedModel, setSelectedModel] = useState<string>('')\r\n const [apiKey, setApiKey] = useState<string>('')\r\n\r\n const [maxTokens, setMaxTokens] = useState<string>(\r\n config.maxTokens?.toString() || DEFAULT_MAX_TOKENS.toString(),\r\n )\r\n const [maxTokensMode, setMaxTokensMode] = useState<'preset' | 'custom'>(\r\n 'preset',\r\n )\r\n const [selectedMaxTokensPreset, setSelectedMaxTokensPreset] =\r\n useState<number>(config.maxTokens || DEFAULT_MAX_TOKENS)\r\n const [reasoningEffort, setReasoningEffort] =\r\n useState<ReasoningEffortOption>('medium')\r\n const [supportsReasoningEffort, setSupportsReasoningEffort] =\r\n useState<boolean>(false)\r\n\r\n const [contextLength, setContextLength] = useState<number>(\r\n DEFAULT_CONTEXT_LENGTH,\r\n )\r\n\r\n const [activeFieldIndex, setActiveFieldIndex] = useState(0)\r\n const [maxTokensCursorOffset, setMaxTokensCursorOffset] = useState<number>(0)\r\n\r\n const [apiKeyCleanedNotification, setApiKeyCleanedNotification] =\r\n useState<boolean>(false)\r\n\r\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([])\r\n const [isLoadingModels, setIsLoadingModels] = useState(false)\r\n const [modelLoadError, setModelLoadError] = useState<string | null>(null)\r\n const [modelSearchQuery, setModelSearchQuery] = useState<string>('')\r\n const [modelSearchCursorOffset, setModelSearchCursorOffset] =\r\n useState<number>(0)\r\n const [cursorOffset, setCursorOffset] = useState<number>(0)\r\n const [apiKeyEdited, setApiKeyEdited] = useState<boolean>(false)\r\n const [providerFocusIndex, setProviderFocusIndex] = useState(0)\r\n const [partnerProviderFocusIndex, setPartnerProviderFocusIndex] = useState(0)\r\n const [codingPlanFocusIndex, setCodingPlanFocusIndex] = useState(0)\r\n\r\n const [fetchRetryCount, setFetchRetryCount] = useState<number>(0)\r\n const [isRetrying, setIsRetrying] = useState<boolean>(false)\r\n\r\n const [isTestingConnection, setIsTestingConnection] = useState<boolean>(false)\r\n const [connectionTestResult, setConnectionTestResult] = useState<{\r\n success: boolean\r\n message: string\r\n endpoint?: string\r\n details?: string\r\n } | null>(null)\r\n\r\n const [validationError, setValidationError] = useState<string | null>(null)\r\n\r\n const [resourceName, setResourceName] = useState<string>('')\r\n const [resourceNameCursorOffset, setResourceNameCursorOffset] =\r\n useState<number>(0)\r\n const [customModelName, setCustomModelName] = useState<string>('')\r\n const [customModelNameCursorOffset, setCustomModelNameCursorOffset] =\r\n useState<number>(0)\r\n\r\n const [ollamaBaseUrl, setOllamaBaseUrl] = useState<string>(\r\n 'http://localhost:11434/v1',\r\n )\r\n const [ollamaBaseUrlCursorOffset, setOllamaBaseUrlCursorOffset] =\r\n useState<number>(0)\r\n\r\n const [customBaseUrl, setCustomBaseUrl] = useState<string>('')\r\n const [customBaseUrlCursorOffset, setCustomBaseUrlCursorOffset] =\r\n useState<number>(0)\r\n\r\n const [providerBaseUrl, setProviderBaseUrl] = useState<string>('')\r\n const [providerBaseUrlCursorOffset, setProviderBaseUrlCursorOffset] =\r\n useState<number>(0)\r\n\r\n const reasoningEffortOptions = REASONING_EFFORT_OPTIONS\r\n\r\n const mainMenuOptions = [\r\n { value: 'custom-openai', label: 'Custom OpenAI-Compatible API' },\r\n { value: 'custom-anthropic', label: 'Custom Messages API (v1/messages)' },\r\n { value: 'partnerProviders', label: 'Partner Providers \u2192' },\r\n { value: 'partnerCodingPlans', label: 'Partner Coding Plans \u2192' },\r\n {\r\n value: 'ollama',\r\n label: getProviderLabel('ollama', models.ollama?.length || 0),\r\n },\r\n ]\r\n\r\n const rankedProviders = [\r\n 'openai',\r\n 'anthropic',\r\n 'gemini',\r\n 'glm',\r\n 'kimi',\r\n 'minimax',\r\n 'qwen',\r\n 'deepseek',\r\n 'openrouter',\r\n 'burncloud',\r\n 'siliconflow',\r\n 'baidu-qianfan',\r\n 'mistral',\r\n 'xai',\r\n 'groq',\r\n 'azure',\r\n ]\r\n\r\n const partnerProviders = rankedProviders.filter(\r\n provider =>\r\n providers[provider] &&\r\n !provider.includes('coding') &&\r\n provider !== 'custom-openai' &&\r\n provider !== 'ollama',\r\n )\r\n\r\n const codingPlanProviders = Object.keys(providers).filter(provider =>\r\n provider.includes('coding'),\r\n )\r\n\r\n const partnerProviderOptions = partnerProviders.map(provider => {\r\n const modelCount = models[provider]?.length || 0\r\n const label = getProviderLabel(provider, modelCount)\r\n return {\r\n label,\r\n value: provider,\r\n }\r\n })\r\n\r\n const codingPlanOptions = codingPlanProviders.map(provider => {\r\n const modelCount = models[provider]?.length || 0\r\n const label = getProviderLabel(provider, modelCount)\r\n return {\r\n label,\r\n value: provider,\r\n }\r\n })\r\n\r\n useEffect(() => {\r\n if (!apiKeyEdited && selectedProvider) {\r\n if (process.env[selectedProvider.toUpperCase() + '_API_KEY']) {\r\n setApiKey(\r\n process.env[selectedProvider.toUpperCase() + '_API_KEY'] as string,\r\n )\r\n } else {\r\n setApiKey('')\r\n }\r\n }\r\n }, [selectedProvider, apiKey, apiKeyEdited])\r\n\r\n useEffect(() => {\r\n if (\r\n currentScreen === 'contextLength' &&\r\n !CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength)\r\n ) {\r\n setContextLength(DEFAULT_CONTEXT_LENGTH)\r\n }\r\n }, [currentScreen, contextLength])\r\n\r\n const providerReservedLines = 8 + containerPaddingY * 2 + containerGap * 2\r\n const partnerReservedLines = 10 + containerPaddingY * 2 + containerGap * 3\r\n const codingReservedLines = partnerReservedLines\r\n const clampIndex = (index: number, length: number) =>\r\n length === 0 ? 0 : Math.max(0, Math.min(index, length - 1))\r\n\r\n useEffect(() => {\r\n setProviderFocusIndex(prev => clampIndex(prev, mainMenuOptions.length))\r\n }, [mainMenuOptions.length])\r\n\r\n useEffect(() => {\r\n setPartnerProviderFocusIndex(prev =>\r\n clampIndex(prev, partnerProviderOptions.length),\r\n )\r\n }, [partnerProviderOptions.length])\r\n\r\n useEffect(() => {\r\n setCodingPlanFocusIndex(prev => clampIndex(prev, codingPlanOptions.length))\r\n }, [codingPlanOptions.length])\r\n\r\n function getProviderLabel(provider: string, modelCount: number): string {\r\n if (providers[provider]) {\r\n return `${providers[provider].name} ${providers[provider].status === 'wip' ? '(WIP)' : ''}`\r\n }\r\n return `${provider}`\r\n }\r\n\r\n function handleProviderSelection(provider: string) {\r\n if (provider === 'partnerProviders') {\r\n setPartnerProviderFocusIndex(0)\r\n navigateTo('partnerProviders')\r\n return\r\n } else if (provider === 'partnerCodingPlans') {\r\n setCodingPlanFocusIndex(0)\r\n navigateTo('partnerCodingPlans')\r\n return\r\n } else if (provider === 'custom-anthropic') {\r\n setSelectedProvider('anthropic' as ProviderType)\r\n setProviderBaseUrl('')\r\n navigateTo('baseUrl')\r\n return\r\n }\r\n\r\n const providerType = provider as ProviderType\r\n setSelectedProvider(providerType)\r\n\r\n if (provider === 'custom') {\r\n saveConfiguration(providerType, selectedModel || '')\r\n onDone()\r\n } else if (provider === 'custom-openai' || provider === 'ollama') {\r\n const defaultBaseUrl = providers[providerType]?.baseURL || ''\r\n setProviderBaseUrl(defaultBaseUrl)\r\n navigateTo('baseUrl')\r\n } else {\r\n const defaultBaseUrl = providers[providerType]?.baseURL || ''\r\n setProviderBaseUrl(defaultBaseUrl)\r\n navigateTo('apiKey')\r\n }\r\n }\r\n\r\n function getSafeVisibleOptionCount(\r\n requestedCount: number,\r\n optionLength: number,\r\n reservedLines: number = 10,\r\n ): number {\r\n const rows = terminalRows\r\n const available = Math.max(1, rows - reservedLines)\r\n return Math.max(1, Math.min(requestedCount, optionLength, available))\r\n }\r\n\r\n async function fetchOllamaModels() {\r\n try {\r\n const response = await fetch(`${ollamaBaseUrl}/models`)\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error ${response.status}: ${response.statusText}`)\r\n }\r\n\r\n const responseData = await response.json()\r\n\r\n let models = []\r\n\r\n if (responseData.data && Array.isArray(responseData.data)) {\r\n models = responseData.data\r\n }\r\n else if (Array.isArray(responseData.models)) {\r\n models = responseData.models\r\n }\r\n else if (Array.isArray(responseData)) {\r\n models = responseData\r\n } else {\r\n throw new Error(\r\n 'Invalid response from Ollama API: missing models array',\r\n )\r\n }\r\n\r\n const ollamaModels = models.map((model: any) => ({\r\n model:\r\n model.id ??\r\n model.name ??\r\n model.modelName ??\r\n (typeof model === 'string' ? model : ''),\r\n provider: 'ollama',\r\n max_tokens: DEFAULT_MAX_TOKENS,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n const validModels = ollamaModels.filter(model => model.model)\r\n\r\n const normalizeOllamaRoot = (url: string): string => {\r\n try {\r\n const u = new URL(url)\r\n let pathname = u.pathname.replace(/\\/+$|^$/, '')\r\n if (pathname.endsWith('/v1')) {\r\n pathname = pathname.slice(0, -3)\r\n }\r\n u.pathname = pathname\r\n return u.toString().replace(/\\/+$/, '')\r\n } catch {\r\n return url.replace(/\\/v1\\/?$/, '')\r\n }\r\n }\r\n\r\n const extractContextTokens = (data: any): number | null => {\r\n if (!data || typeof data !== 'object') return null\r\n\r\n if (data.model_info && typeof data.model_info === 'object') {\r\n const modelInfo = data.model_info\r\n for (const key of Object.keys(modelInfo)) {\r\n if (\r\n key.endsWith('.context_length') ||\r\n key.endsWith('_context_length')\r\n ) {\r\n const val = modelInfo[key]\r\n if (typeof val === 'number' && isFinite(val) && val > 0) {\r\n return val\r\n }\r\n }\r\n }\r\n }\r\n\r\n const candidates = [\r\n (data as any)?.parameters?.num_ctx,\r\n (data as any)?.model_info?.num_ctx,\r\n (data as any)?.config?.num_ctx,\r\n (data as any)?.details?.context_length,\r\n (data as any)?.context_length,\r\n (data as any)?.num_ctx,\r\n (data as any)?.max_tokens,\r\n (data as any)?.max_new_tokens,\r\n ].filter((v: any) => typeof v === 'number' && isFinite(v) && v > 0)\r\n if (candidates.length > 0) {\r\n return Math.max(...candidates)\r\n }\r\n\r\n if (typeof (data as any)?.parameters === 'string') {\r\n const m = (data as any).parameters.match(/num_ctx\\s*[:=]\\s*(\\d+)/i)\r\n if (m) {\r\n const n = parseInt(m[1], 10)\r\n if (Number.isFinite(n) && n > 0) return n\r\n }\r\n }\r\n return null\r\n }\r\n\r\n const ollamaRoot = normalizeOllamaRoot(ollamaBaseUrl)\r\n const enrichedModels = await Promise.all(\r\n validModels.map(async (m: any) => {\r\n try {\r\n const showResp = await fetch(`${ollamaRoot}/api/show`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ name: m.model }),\r\n })\r\n if (showResp.ok) {\r\n const showData = await showResp.json()\r\n const ctx = extractContextTokens(showData)\r\n if (typeof ctx === 'number' && isFinite(ctx) && ctx > 0) {\r\n return { ...m, context_length: ctx }\r\n }\r\n }\r\n return m\r\n } catch {\r\n return m\r\n }\r\n }),\r\n )\r\n\r\n setAvailableModels(enrichedModels)\r\n\r\n if (enrichedModels.length > 0) {\r\n navigateTo('model')\r\n } else {\r\n setModelLoadError('No models found in your Ollama installation')\r\n }\r\n\r\n return enrichedModels\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error)\r\n\r\n if (errorMessage.includes('fetch')) {\r\n setModelLoadError(\r\n `Could not connect to Ollama server at ${ollamaBaseUrl}. Make sure Ollama is running and the URL is correct.`,\r\n )\r\n } else {\r\n setModelLoadError(`Error loading Ollama models: ${errorMessage}`)\r\n }\r\n\r\n debugLogger.warn('OLLAMA_FETCH_ERROR', {\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n return []\r\n }\r\n }\r\n\r\n async function fetchModelsWithRetry() {\r\n const MAX_RETRIES = 2\r\n let lastError: Error | null = null\r\n\r\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\r\n setFetchRetryCount(attempt)\r\n setIsRetrying(attempt > 1)\r\n\r\n if (attempt > 1) {\r\n setModelLoadError(\r\n `Attempt ${attempt}/${MAX_RETRIES}: Retrying model discovery...`,\r\n )\r\n await new Promise(resolve => setTimeout(resolve, 1000))\r\n }\r\n\r\n try {\r\n const models = await fetchModels()\r\n setFetchRetryCount(0)\r\n setIsRetrying(false)\r\n setModelLoadError(null)\r\n return models\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error))\r\n debugLogger.warn('MODEL_FETCH_RETRY_FAILED', {\r\n attempt,\r\n maxRetries: MAX_RETRIES,\r\n error: lastError.message,\r\n provider: selectedProvider,\r\n })\r\n\r\n if (attempt === MAX_RETRIES) {\r\n break\r\n }\r\n }\r\n }\r\n\r\n setIsRetrying(false)\r\n const errorMessage = lastError?.message || 'Unknown error'\r\n\r\n const supportsManualInput = [\r\n 'anthropic',\r\n 'kimi',\r\n 'deepseek',\r\n 'siliconflow',\r\n 'qwen',\r\n 'glm',\r\n 'minimax',\r\n 'baidu-qianfan',\r\n 'custom-openai',\r\n ].includes(selectedProvider)\r\n\r\n setModelLoadError(\r\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.`,\r\n )\r\n\r\n throw new Error(`API key validation failed: ${errorMessage}`)\r\n }\r\n\r\n async function fetchModels() {\r\n setIsLoadingModels(true)\r\n setModelLoadError(null)\r\n\r\n try {\r\n if (selectedProvider === 'anthropic') {\r\n const anthropicModels =\r\n await modelFetchers.fetchAnthropicCompatibleProviderModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(anthropicModels)\r\n navigateTo('model')\r\n return anthropicModels\r\n }\r\n\r\n if (selectedProvider === 'custom-openai') {\r\n const customModels = await modelFetchers.fetchCustomOpenAIModels({\r\n apiKey,\r\n customBaseUrl,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(customModels)\r\n navigateTo('model')\r\n return customModels\r\n }\r\n\r\n if (selectedProvider === 'gemini') {\r\n const geminiModels = await modelFetchers.fetchGeminiModels({\r\n apiKey,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(geminiModels)\r\n navigateTo('model')\r\n return geminiModels\r\n }\r\n\r\n if (selectedProvider === 'kimi') {\r\n const kimiModels = await modelFetchers.fetchKimiModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(kimiModels)\r\n navigateTo('model')\r\n return kimiModels\r\n }\r\n\r\n if (selectedProvider === 'deepseek') {\r\n const deepseekModels = await modelFetchers.fetchDeepSeekModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(deepseekModels)\r\n navigateTo('model')\r\n return deepseekModels\r\n }\r\n\r\n if (selectedProvider === 'siliconflow') {\r\n const siliconflowModels = await modelFetchers.fetchSiliconFlowModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(siliconflowModels)\r\n navigateTo('model')\r\n return siliconflowModels\r\n }\r\n\r\n if (selectedProvider === 'qwen') {\r\n const qwenModels = await modelFetchers.fetchQwenModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(qwenModels)\r\n navigateTo('model')\r\n return qwenModels\r\n }\r\n\r\n if (selectedProvider === 'glm') {\r\n const glmModels = await modelFetchers.fetchGLMModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(glmModels)\r\n navigateTo('model')\r\n return glmModels\r\n }\r\n\r\n if (selectedProvider === 'baidu-qianfan') {\r\n const baiduModels = await modelFetchers.fetchBaiduQianfanModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n })\r\n setAvailableModels(baiduModels)\r\n navigateTo('model')\r\n return baiduModels\r\n }\r\n\r\n if (selectedProvider === 'azure') {\r\n navigateTo('modelInput')\r\n return []\r\n }\r\n\r\n let baseURL = providerBaseUrl || providers[selectedProvider]?.baseURL\r\n\r\n if (selectedProvider === 'custom-openai') {\r\n baseURL = customBaseUrl\r\n }\r\n\r\n const openai = new OpenAI({\r\n apiKey: apiKey || 'dummy-key-for-ollama',\r\n baseURL: baseURL,\r\n dangerouslyAllowBrowser: true,\r\n })\r\n\r\n const response = await openai.models.list()\r\n\r\n const fetchedModels = []\r\n for (const model of response.data) {\r\n const modelName =\r\n (model as any).modelName ||\r\n (model as any).id ||\r\n (model as any).name ||\r\n (model as any).model ||\r\n 'unknown'\r\n const modelInfo = models[selectedProvider as keyof typeof models]?.find(\r\n m => m.model === modelName,\r\n )\r\n fetchedModels.push({\r\n model: modelName,\r\n provider: selectedProvider,\r\n max_tokens: modelInfo?.max_output_tokens,\r\n supports_vision: modelInfo?.supports_vision || false,\r\n supports_function_calling:\r\n modelInfo?.supports_function_calling || false,\r\n supports_reasoning_effort:\r\n modelInfo?.supports_reasoning_effort || false,\r\n })\r\n }\r\n\r\n setAvailableModels(fetchedModels)\r\n\r\n navigateTo('model')\r\n\r\n return fetchedModels\r\n } catch (error) {\r\n debugLogger.warn('MODEL_FETCH_ERROR', {\r\n provider: selectedProvider,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n throw error\r\n } finally {\r\n setIsLoadingModels(false)\r\n }\r\n }\r\n\r\n async function handleApiKeySubmit(key: string) {\r\n const cleanedKey = key.replace(/[\\r\\n]/g, '').trim()\r\n setApiKey(cleanedKey)\r\n\r\n setModelLoadError(null)\r\n\r\n if (selectedProvider === 'azure') {\r\n navigateTo('resourceName')\r\n return\r\n }\r\n\r\n try {\r\n setIsLoadingModels(true)\r\n const models = await fetchModelsWithRetry()\r\n\r\n if (models && models.length > 0) {\r\n } else if (models && models.length === 0) {\r\n navigateTo('modelInput')\r\n }\r\n } catch (error) {\r\n debugLogger.warn('API_KEY_VALIDATION_FAILED', {\r\n provider: selectedProvider,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n } finally {\r\n setIsLoadingModels(false)\r\n }\r\n }\r\n\r\n function handleResourceNameSubmit(name: string) {\r\n setResourceName(name)\r\n navigateTo('modelInput')\r\n }\r\n\r\n function handleOllamaBaseUrlSubmit(url: string) {\r\n setOllamaBaseUrl(url)\r\n setIsLoadingModels(true)\r\n setModelLoadError(null)\r\n\r\n fetchOllamaModels().finally(() => {\r\n setIsLoadingModels(false)\r\n })\r\n }\r\n\r\n function handleCustomBaseUrlSubmit(url: string) {\r\n const cleanUrl = url.replace(/\\/+$/, '')\r\n setCustomBaseUrl(cleanUrl)\r\n navigateTo('apiKey')\r\n }\r\n\r\n function handleProviderBaseUrlSubmit(url: string) {\r\n const cleanUrl = url.replace(/\\/+$/, '')\r\n setProviderBaseUrl(cleanUrl)\r\n\r\n if (selectedProvider === 'ollama') {\r\n setOllamaBaseUrl(cleanUrl)\r\n setIsLoadingModels(true)\r\n setModelLoadError(null)\r\n\r\n fetchOllamaModels().finally(() => {\r\n setIsLoadingModels(false)\r\n })\r\n } else {\r\n navigateTo('apiKey')\r\n }\r\n }\r\n\r\n function handleCustomModelSubmit(model: string) {\r\n setCustomModelName(model)\r\n setSelectedModel(model)\r\n\r\n setSupportsReasoningEffort(false)\r\n setReasoningEffort(null)\r\n\r\n setMaxTokensMode('preset')\r\n setSelectedMaxTokensPreset(DEFAULT_MAX_TOKENS)\r\n setMaxTokens(DEFAULT_MAX_TOKENS.toString())\r\n setMaxTokensCursorOffset(DEFAULT_MAX_TOKENS.toString().length)\r\n\r\n navigateTo('modelParams')\r\n setActiveFieldIndex(0)\r\n }\r\n\r\n function handleModelSelection(model: string) {\r\n setSelectedModel(model)\r\n\r\n const modelInfo = availableModels.find(m => m.model === model)\r\n setSupportsReasoningEffort(modelInfo?.supports_reasoning_effort || false)\r\n\r\n if (!modelInfo?.supports_reasoning_effort) {\r\n setReasoningEffort(null)\r\n }\r\n\r\n if (modelInfo?.context_length) {\r\n setContextLength(modelInfo.context_length)\r\n } else {\r\n setContextLength(DEFAULT_CONTEXT_LENGTH)\r\n }\r\n\r\n if (modelInfo?.max_tokens) {\r\n const modelMaxTokens = modelInfo.max_tokens\r\n const matchingPreset = MAX_TOKENS_OPTIONS.find(\r\n option => option.value === modelMaxTokens,\r\n )\r\n\r\n if (matchingPreset) {\r\n setMaxTokensMode('preset')\r\n setSelectedMaxTokensPreset(modelMaxTokens)\r\n setMaxTokens(modelMaxTokens.toString())\r\n } else {\r\n setMaxTokensMode('custom')\r\n setMaxTokens(modelMaxTokens.toString())\r\n }\r\n setMaxTokensCursorOffset(modelMaxTokens.toString().length)\r\n } else {\r\n setMaxTokensMode('preset')\r\n setSelectedMaxTokensPreset(DEFAULT_MAX_TOKENS)\r\n setMaxTokens(DEFAULT_MAX_TOKENS.toString())\r\n setMaxTokensCursorOffset(DEFAULT_MAX_TOKENS.toString().length)\r\n }\r\n\r\n navigateTo('modelParams')\r\n setActiveFieldIndex(0)\r\n }\r\n\r\n const handleModelParamsSubmit = () => {\r\n if (!CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength)) {\r\n setContextLength(DEFAULT_CONTEXT_LENGTH)\r\n }\r\n navigateTo('contextLength')\r\n }\r\n\r\n async function testConnection(): Promise<{\r\n success: boolean\r\n message: string\r\n endpoint?: string\r\n details?: string\r\n }> {\r\n setIsTestingConnection(true)\r\n setConnectionTestResult(null)\r\n\r\n try {\r\n let testBaseURL =\r\n providerBaseUrl || providers[selectedProvider]?.baseURL || ''\r\n\r\n if (selectedProvider === 'azure') {\r\n testBaseURL = `https://${resourceName}.openai.azure.com/openai/deployments/${selectedModel}`\r\n } else if (selectedProvider === 'custom-openai') {\r\n testBaseURL = customBaseUrl\r\n }\r\n\r\n const isOpenAICompatible = [\r\n 'minimax',\r\n 'kimi',\r\n 'deepseek',\r\n 'siliconflow',\r\n 'qwen',\r\n 'glm',\r\n 'baidu-qianfan',\r\n 'openai',\r\n 'mistral',\r\n 'xai',\r\n 'groq',\r\n 'custom-openai',\r\n ].includes(selectedProvider)\r\n\r\n if (isOpenAICompatible) {\r\n const isGPT5 = selectedModel?.toLowerCase().includes('gpt-5')\r\n\r\n if (isGPT5) {\r\n debugLogger.api('GPT5_CONNECTION_TEST_USING_SPECIALIZED', {\r\n model: selectedModel,\r\n provider: selectedProvider,\r\n })\r\n\r\n const configValidation = validateGPT5Config({\r\n model: selectedModel,\r\n apiKey: apiKey,\r\n baseURL: testBaseURL,\r\n maxTokens: parseInt(maxTokens) || 8192,\r\n provider: selectedProvider,\r\n })\r\n\r\n if (!configValidation.valid) {\r\n return {\r\n success: false,\r\n message: '\u274C GPT-5 configuration validation failed',\r\n details: configValidation.errors.join('\\n'),\r\n }\r\n }\r\n\r\n const gpt5Result = await testGPT5Connection({\r\n model: selectedModel,\r\n apiKey: apiKey,\r\n baseURL: testBaseURL,\r\n maxTokens: parseInt(maxTokens) || 8192,\r\n provider: selectedProvider,\r\n })\r\n\r\n return gpt5Result\r\n }\r\n\r\n const endpointsToTry = []\r\n\r\n if (selectedProvider === 'minimax') {\r\n endpointsToTry.push(\r\n {\r\n path: '/text/chatcompletion_v2',\r\n name: 'MiniMax v2 (recommended)',\r\n },\r\n { path: '/chat/completions', name: 'Standard OpenAI' },\r\n )\r\n } else {\r\n endpointsToTry.push({\r\n path: '/chat/completions',\r\n name: 'Standard OpenAI',\r\n })\r\n }\r\n\r\n let lastError = null\r\n for (const endpoint of endpointsToTry) {\r\n try {\r\n const testResult = await testChatEndpoint(\r\n testBaseURL,\r\n endpoint.path,\r\n endpoint.name,\r\n )\r\n\r\n if (testResult.success) {\r\n return testResult\r\n }\r\n lastError = testResult\r\n } catch (error) {\r\n lastError = {\r\n success: false,\r\n message: `Failed to test ${endpoint.name}`,\r\n endpoint: endpoint.path,\r\n details: error instanceof Error ? error.message : String(error),\r\n }\r\n }\r\n }\r\n\r\n return (\r\n lastError || {\r\n success: false,\r\n message: 'All endpoints failed',\r\n details: 'No endpoints could be reached',\r\n }\r\n )\r\n } else {\r\n return await testProviderSpecificEndpoint(testBaseURL)\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n message: 'Connection test failed',\r\n details: error instanceof Error ? error.message : String(error),\r\n }\r\n } finally {\r\n setIsTestingConnection(false)\r\n }\r\n }\r\n\r\n async function testChatEndpoint(\r\n baseURL: string,\r\n endpointPath: string,\r\n endpointName: string,\r\n ): Promise<{\r\n success: boolean\r\n message: string\r\n endpoint?: string\r\n details?: string\r\n }> {\r\n const testURL = `${baseURL.replace(/\\/+$/, '')}${endpointPath}`\r\n\r\n const testPayload: any = {\r\n model: selectedModel,\r\n messages: [\r\n {\r\n role: 'user',\r\n content:\r\n 'Please respond with exactly \"YES\" (in capital letters) to confirm this connection is working.',\r\n },\r\n ],\r\n max_tokens: Math.max(parseInt(maxTokens) || 8192, 8192),\r\n temperature: 0,\r\n stream: false,\r\n }\r\n\r\n if (selectedModel && selectedModel.toLowerCase().includes('gpt-5')) {\r\n debugLogger.api('GPT5_PARAMETER_FIX_APPLY', { model: selectedModel })\r\n\r\n if (testPayload.max_tokens) {\r\n testPayload.max_completion_tokens = testPayload.max_tokens\r\n delete testPayload.max_tokens\r\n debugLogger.api('GPT5_PARAMETER_FIX_MAX_TOKENS', {\r\n model: selectedModel,\r\n max_completion_tokens: testPayload.max_completion_tokens,\r\n })\r\n }\r\n\r\n if (\r\n testPayload.temperature !== undefined &&\r\n testPayload.temperature !== 1\r\n ) {\r\n debugLogger.api('GPT5_PARAMETER_FIX_TEMPERATURE', {\r\n model: selectedModel,\r\n from: testPayload.temperature,\r\n to: 1,\r\n })\r\n testPayload.temperature = 1\r\n }\r\n }\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n }\r\n\r\n if (selectedProvider === 'azure') {\r\n headers['api-key'] = apiKey\r\n } else {\r\n headers['Authorization'] = `Bearer ${apiKey}`\r\n }\r\n\r\n try {\r\n const response = await fetch(testURL, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(testPayload),\r\n })\r\n\r\n if (response.ok) {\r\n const data = await response.json()\r\n debugLogger.api('CONNECTION_TEST_RESPONSE', {\r\n provider: selectedProvider,\r\n endpoint: endpointPath,\r\n ok: true,\r\n })\r\n\r\n let responseContent = ''\r\n\r\n if (data.choices && data.choices.length > 0) {\r\n responseContent = data.choices[0]?.message?.content || ''\r\n } else if (data.reply) {\r\n responseContent = data.reply\r\n } else if (data.output) {\r\n responseContent = data.output?.text || data.output || ''\r\n }\r\n\r\n debugLogger.api('CONNECTION_TEST_RESPONSE_PARSED', {\r\n provider: selectedProvider,\r\n endpoint: endpointPath,\r\n contentLength: responseContent.length,\r\n })\r\n\r\n const containsYes = responseContent.toLowerCase().includes('yes')\r\n\r\n if (containsYes) {\r\n return {\r\n success: true,\r\n message: `\u2705 Connection test passed with ${endpointName}`,\r\n endpoint: endpointPath,\r\n details: `Model responded correctly: \"${responseContent.trim()}\"`,\r\n }\r\n } else {\r\n return {\r\n success: false,\r\n message: `\u26A0\uFE0F ${endpointName} connected but model response unexpected`,\r\n endpoint: endpointPath,\r\n details: `Expected \"YES\" but got: \"${responseContent.trim() || '(empty response)'}\"`,\r\n }\r\n }\r\n } else {\r\n const errorData = await response.json().catch(() => null)\r\n const errorMessage =\r\n errorData?.error?.message || errorData?.message || response.statusText\r\n\r\n return {\r\n success: false,\r\n message: `\u274C ${endpointName} failed (${response.status})`,\r\n endpoint: endpointPath,\r\n details: `Error: ${errorMessage}`,\r\n }\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n message: `\u274C ${endpointName} connection failed`,\r\n endpoint: endpointPath,\r\n details: error instanceof Error ? error.message : String(error),\r\n }\r\n }\r\n }\r\n\r\n async function testResponsesEndpoint(\r\n baseURL: string,\r\n endpointPath: string,\r\n endpointName: string,\r\n ): Promise<{\r\n success: boolean\r\n message: string\r\n endpoint?: string\r\n details?: string\r\n }> {\r\n const testURL = `${baseURL.replace(/\\/+$/, '')}${endpointPath}`\r\n\r\n const testPayload: any = {\r\n model: selectedModel,\r\n input: [\r\n {\r\n role: 'user',\r\n content:\r\n 'Please respond with exactly \"YES\" (in capital letters) to confirm this connection is working.',\r\n },\r\n ],\r\n max_completion_tokens: Math.max(parseInt(maxTokens) || 8192, 8192),\r\n temperature: 1,\r\n reasoning: {\r\n effort: 'low',\r\n },\r\n }\r\n\r\n debugLogger.api('GPT5_RESPONSES_API_TEST_START', {\r\n model: selectedModel,\r\n url: testURL,\r\n })\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${apiKey}`,\r\n }\r\n\r\n try {\r\n const response = await fetch(testURL, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(testPayload),\r\n })\r\n\r\n if (response.ok) {\r\n const data = await response.json()\r\n debugLogger.api('GPT5_RESPONSES_API_TEST_RESPONSE', {\r\n model: selectedModel,\r\n ok: true,\r\n })\r\n\r\n let responseContent = ''\r\n\r\n if (data.output_text) {\r\n responseContent = data.output_text\r\n } else if (data.output) {\r\n responseContent =\r\n typeof data.output === 'string'\r\n ? data.output\r\n : data.output.text || ''\r\n }\r\n\r\n debugLogger.api('GPT5_RESPONSES_API_TEST_RESPONSE_PARSED', {\r\n model: selectedModel,\r\n contentLength: responseContent.length,\r\n })\r\n\r\n const containsYes = responseContent.toLowerCase().includes('yes')\r\n\r\n if (containsYes) {\r\n return {\r\n success: true,\r\n message: `\u2705 Connection test passed with ${endpointName}`,\r\n endpoint: endpointPath,\r\n details: `GPT-5 responded correctly via Responses API: \"${responseContent.trim()}\"`,\r\n }\r\n } else {\r\n return {\r\n success: false,\r\n message: `\u26A0\uFE0F ${endpointName} connected but model response unexpected`,\r\n endpoint: endpointPath,\r\n details: `Expected \"YES\" but got: \"${responseContent.trim() || '(empty response)'}\"`,\r\n }\r\n }\r\n } else {\r\n const errorData = await response.json().catch(() => null)\r\n const errorMessage =\r\n errorData?.error?.message || errorData?.message || response.statusText\r\n\r\n debugLogger.warn('GPT5_RESPONSES_API_TEST_ERROR', {\r\n model: selectedModel,\r\n status: response.status,\r\n error:\r\n errorData?.error?.message || errorData?.message || response.statusText,\r\n })\r\n\r\n let details = `Responses API Error: ${errorMessage}`\r\n if (response.status === 400 && errorMessage.includes('max_tokens')) {\r\n details +=\r\n '\\n\uD83D\uDD27 Note: This appears to be a parameter compatibility issue. The fallback to Chat Completions should handle this.'\r\n } else if (response.status === 404) {\r\n details +=\r\n '\\n\uD83D\uDD27 Note: Responses API endpoint may not be available for this model or provider.'\r\n } else if (response.status === 401) {\r\n details += '\\n\uD83D\uDD27 Note: API key authentication failed.'\r\n }\r\n\r\n return {\r\n success: false,\r\n message: `\u274C ${endpointName} failed (${response.status})`,\r\n endpoint: endpointPath,\r\n details: details,\r\n }\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n message: `\u274C ${endpointName} connection failed`,\r\n endpoint: endpointPath,\r\n details: error instanceof Error ? error.message : String(error),\r\n }\r\n }\r\n }\r\n\r\n async function testProviderSpecificEndpoint(baseURL: string): Promise<{\r\n success: boolean\r\n message: string\r\n endpoint?: string\r\n details?: string\r\n }> {\r\n if (selectedProvider === 'anthropic' || selectedProvider === 'bigdream') {\r\n try {\r\n debugLogger.api('PROVIDER_CONNECTION_TEST_NATIVE_SDK', {\r\n provider: selectedProvider,\r\n })\r\n\r\n let testBaseURL: string | undefined = undefined\r\n if (selectedProvider === 'bigdream') {\r\n testBaseURL = baseURL || 'https://api-key.info'\r\n } else if (selectedProvider === 'anthropic') {\r\n testBaseURL =\r\n baseURL && baseURL !== 'https://api.anthropic.com'\r\n ? baseURL\r\n : undefined\r\n }\r\n\r\n const isValid = await verifyApiKey(\r\n apiKey,\r\n testBaseURL,\r\n selectedProvider,\r\n )\r\n\r\n if (isValid) {\r\n return {\r\n success: true,\r\n message: `\u2705 ${selectedProvider} connection test passed`,\r\n endpoint: '/messages',\r\n details: 'API key verified using native SDK',\r\n }\r\n } else {\r\n return {\r\n success: false,\r\n message: `\u274C ${selectedProvider} API key verification failed`,\r\n endpoint: '/messages',\r\n details:\r\n 'Invalid API key. Please check your API key and try again.',\r\n }\r\n }\r\n } catch (error) {\r\n debugLogger.warn('PROVIDER_CONNECTION_TEST_NATIVE_SDK_ERROR', {\r\n provider: selectedProvider,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n return {\r\n success: false,\r\n message: `\u274C ${selectedProvider} connection failed`,\r\n endpoint: '/messages',\r\n details: error instanceof Error ? error.message : String(error),\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n message: `\u2705 Configuration saved for ${selectedProvider}`,\r\n details: 'Provider-specific testing not implemented yet',\r\n }\r\n }\r\n\r\n async function handleConnectionTest() {\r\n const result = await testConnection()\r\n setConnectionTestResult(result)\r\n\r\n if (result.success) {\r\n setTimeout(() => {\r\n navigateTo('confirmation')\r\n }, 2000)\r\n }\r\n }\r\n\r\n const handleContextLengthSubmit = () => {\r\n navigateTo('connectionTest')\r\n }\r\n\r\n async function saveConfiguration(\r\n provider: ProviderType,\r\n model: string,\r\n ): Promise<string | null> {\r\n let baseURL = providerBaseUrl || providers[provider]?.baseURL || ''\r\n let actualProvider = provider\r\n\r\n if (provider === 'anthropic') {\r\n actualProvider = 'anthropic'\r\n baseURL = baseURL || 'https://api.anthropic.com'\r\n }\r\n\r\n if (provider === 'azure') {\r\n baseURL = `https://${resourceName}.openai.azure.com/openai/deployments/${model}`\r\n }\r\n else if (provider === 'custom-openai') {\r\n baseURL = customBaseUrl\r\n }\r\n\r\n try {\r\n const modelManager = getModelManager()\r\n\r\n const displayModel = model || 'default'\r\n const modelDisplayName =\r\n `${providers[actualProvider]?.name || actualProvider} ${displayModel}`.trim()\r\n\r\n const modelConfig = {\r\n name: modelDisplayName,\r\n provider: actualProvider,\r\n modelName: model || actualProvider,\r\n baseURL: baseURL,\r\n apiKey: apiKey || '',\r\n maxTokens: parseInt(maxTokens) || DEFAULT_MAX_TOKENS,\r\n contextLength: contextLength || DEFAULT_CONTEXT_LENGTH,\r\n reasoningEffort,\r\n }\r\n\r\n return await modelManager.addModel(modelConfig)\r\n } catch (error) {\r\n setValidationError(\r\n error instanceof Error ? error.message : 'Failed to add model',\r\n )\r\n return null\r\n }\r\n }\r\n\r\n async function handleConfirmation() {\r\n setValidationError(null)\r\n\r\n const modelId = await saveConfiguration(selectedProvider, selectedModel)\r\n\r\n if (!modelId) {\r\n return\r\n }\r\n\r\n setModelPointer('main', modelId)\r\n\r\n if (isOnboarding) {\r\n setAllPointersToModel(modelId)\r\n } else if (targetPointer && targetPointer !== 'main') {\r\n setModelPointer(targetPointer, modelId)\r\n }\r\n\r\n onDone()\r\n }\r\n\r\n const handleBack = () => {\r\n if (\r\n currentScreen === 'partnerProviders' ||\r\n currentScreen === 'partnerCodingPlans'\r\n ) {\r\n setProviderFocusIndex(0)\r\n setScreenStack(['provider'])\r\n return\r\n }\r\n\r\n if (currentScreen === 'provider') {\r\n if (onCancel) {\r\n onCancel()\r\n } else {\r\n onDone()\r\n }\r\n return\r\n }\r\n\r\n if (currentScreen === 'apiKey' && screenStack.length >= 2) {\r\n const previousScreen = screenStack[screenStack.length - 2]\r\n if (\r\n previousScreen === 'partnerProviders' ||\r\n previousScreen === 'partnerCodingPlans'\r\n ) {\r\n setScreenStack(prev => prev.slice(0, -1))\r\n return\r\n }\r\n }\r\n\r\n if (screenStack.length > 1) {\r\n setScreenStack(prev => prev.slice(0, -1))\r\n } else {\r\n setProviderFocusIndex(0)\r\n setScreenStack(['provider'])\r\n }\r\n }\r\n\r\n useEscapeNavigation(handleBack, abortController)\r\n\r\n function handleCursorOffsetChange(offset: number) {\r\n setCursorOffset(offset)\r\n }\r\n\r\n function formatApiKeyDisplay(key: string): string {\r\n if (!key) return ''\r\n if (key.length <= 10) return '*'.repeat(key.length)\r\n\r\n const prefix = key.slice(0, 4)\r\n const suffix = key.slice(-4)\r\n const middleLength = Math.max(0, key.length - 8)\r\n const middle = '*'.repeat(Math.min(middleLength, 30))\r\n\r\n return `${prefix}${middle}${suffix}`\r\n }\r\n\r\n function handleApiKeyChange(value: string) {\r\n setApiKeyEdited(true)\r\n const cleanedValue = value.replace(/[\\r\\n]/g, '').trim()\r\n\r\n if (value !== cleanedValue && value.length > 0) {\r\n setApiKeyCleanedNotification(true)\r\n setTimeout(() => setApiKeyCleanedNotification(false), 3000)\r\n }\r\n\r\n setApiKey(cleanedValue)\r\n setCursorOffset(cleanedValue.length)\r\n }\r\n\r\n function handleModelSearchChange(value: string) {\r\n setModelSearchQuery(value)\r\n setModelSearchCursorOffset(value.length)\r\n }\r\n\r\n function handleModelSearchCursorOffsetChange(offset: number) {\r\n setModelSearchCursorOffset(offset)\r\n }\r\n\r\n useInput((input, key) => {\r\n if (currentScreen === 'provider') {\r\n if (key.upArrow) {\r\n setProviderFocusIndex(prev =>\r\n mainMenuOptions.length === 0\r\n ? 0\r\n : (prev - 1 + mainMenuOptions.length) % mainMenuOptions.length,\r\n )\r\n return\r\n }\r\n if (key.downArrow) {\r\n setProviderFocusIndex(prev =>\r\n mainMenuOptions.length === 0\r\n ? 0\r\n : (prev + 1) % mainMenuOptions.length,\r\n )\r\n return\r\n }\r\n if (key.return) {\r\n const opt = mainMenuOptions[providerFocusIndex]\r\n if (opt) {\r\n handleProviderSelection(opt.value)\r\n }\r\n return\r\n }\r\n }\r\n\r\n if (currentScreen === 'partnerProviders') {\r\n if (key.upArrow) {\r\n setPartnerProviderFocusIndex(prev =>\r\n partnerProviderOptions.length === 0\r\n ? 0\r\n : (prev - 1 + partnerProviderOptions.length) %\r\n partnerProviderOptions.length,\r\n )\r\n return\r\n }\r\n if (key.downArrow) {\r\n setPartnerProviderFocusIndex(prev =>\r\n partnerProviderOptions.length === 0\r\n ? 0\r\n : (prev + 1) % partnerProviderOptions.length,\r\n )\r\n return\r\n }\r\n if (key.return) {\r\n const opt = partnerProviderOptions[partnerProviderFocusIndex]\r\n if (opt) {\r\n handleProviderSelection(opt.value)\r\n }\r\n return\r\n }\r\n }\r\n\r\n if (currentScreen === 'partnerCodingPlans') {\r\n if (key.upArrow) {\r\n setCodingPlanFocusIndex(prev =>\r\n codingPlanOptions.length === 0\r\n ? 0\r\n : (prev - 1 + codingPlanOptions.length) % codingPlanOptions.length,\r\n )\r\n return\r\n }\r\n if (key.downArrow) {\r\n setCodingPlanFocusIndex(prev =>\r\n codingPlanOptions.length === 0\r\n ? 0\r\n : (prev + 1) % codingPlanOptions.length,\r\n )\r\n return\r\n }\r\n if (key.return) {\r\n const opt = codingPlanOptions[codingPlanFocusIndex]\r\n if (opt) {\r\n handleProviderSelection(opt.value)\r\n }\r\n return\r\n }\r\n }\r\n\r\n if (currentScreen === 'apiKey' && key.return) {\r\n if (apiKey) {\r\n handleApiKeySubmit(apiKey)\r\n }\r\n return\r\n }\r\n\r\n if (currentScreen === 'apiKey' && key.tab) {\r\n if (\r\n selectedProvider === 'anthropic' ||\r\n selectedProvider === 'kimi' ||\r\n selectedProvider === 'deepseek' ||\r\n selectedProvider === 'qwen' ||\r\n selectedProvider === 'glm' ||\r\n selectedProvider === 'glm-coding' ||\r\n selectedProvider === 'minimax' ||\r\n selectedProvider === 'minimax-coding' ||\r\n selectedProvider === 'baidu-qianfan' ||\r\n selectedProvider === 'siliconflow' ||\r\n selectedProvider === 'custom-openai'\r\n ) {\r\n navigateTo('modelInput')\r\n return\r\n }\r\n\r\n fetchModelsWithRetry().catch(error => {\r\n debugLogger.warn('MODEL_FETCH_FINAL_ERROR', {\r\n provider: selectedProvider,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n })\r\n return\r\n }\r\n\r\n if (currentScreen === 'resourceName' && key.return) {\r\n if (resourceName) {\r\n handleResourceNameSubmit(resourceName)\r\n }\r\n return\r\n }\r\n\r\n if (currentScreen === 'baseUrl' && key.return) {\r\n if (selectedProvider === 'custom-openai') {\r\n handleCustomBaseUrlSubmit(customBaseUrl)\r\n } else {\r\n handleProviderBaseUrlSubmit(providerBaseUrl)\r\n }\r\n return\r\n }\r\n\r\n if (currentScreen === 'modelInput' && key.return) {\r\n if (customModelName) {\r\n handleCustomModelSubmit(customModelName)\r\n }\r\n return\r\n }\r\n\r\n if (currentScreen === 'confirmation' && key.return) {\r\n handleConfirmation().catch(error => {\r\n debugLogger.warn('CONFIRMATION_ERROR', {\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n setValidationError(\r\n error instanceof Error ? error.message : 'Unexpected error occurred',\r\n )\r\n })\r\n return\r\n }\r\n\r\n if (currentScreen === 'connectionTest') {\r\n if (key.return) {\r\n if (!isTestingConnection && !connectionTestResult) {\r\n handleConnectionTest()\r\n } else if (connectionTestResult && connectionTestResult.success) {\r\n navigateTo('confirmation')\r\n } else if (connectionTestResult && !connectionTestResult.success) {\r\n handleConnectionTest()\r\n }\r\n return\r\n }\r\n }\r\n\r\n if (currentScreen === 'contextLength') {\r\n if (key.return) {\r\n handleContextLengthSubmit()\r\n return\r\n }\r\n\r\n if (key.upArrow) {\r\n const currentIndex = CONTEXT_LENGTH_OPTIONS.findIndex(\r\n opt => opt.value === contextLength,\r\n )\r\n const newIndex =\r\n currentIndex > 0\r\n ? currentIndex - 1\r\n : currentIndex === -1\r\n ? CONTEXT_LENGTH_OPTIONS.findIndex(\r\n opt => opt.value === DEFAULT_CONTEXT_LENGTH,\r\n ) || 0\r\n : CONTEXT_LENGTH_OPTIONS.length - 1\r\n setContextLength(CONTEXT_LENGTH_OPTIONS[newIndex].value)\r\n return\r\n }\r\n\r\n if (key.downArrow) {\r\n const currentIndex = CONTEXT_LENGTH_OPTIONS.findIndex(\r\n opt => opt.value === contextLength,\r\n )\r\n const newIndex =\r\n currentIndex === -1\r\n ? CONTEXT_LENGTH_OPTIONS.findIndex(\r\n opt => opt.value === DEFAULT_CONTEXT_LENGTH,\r\n ) || 0\r\n : (currentIndex + 1) % CONTEXT_LENGTH_OPTIONS.length\r\n setContextLength(CONTEXT_LENGTH_OPTIONS[newIndex].value)\r\n return\r\n }\r\n }\r\n\r\n if (\r\n currentScreen === 'apiKey' &&\r\n ((key.ctrl && input === 'v') || (key.meta && input === 'v'))\r\n ) {\r\n setModelLoadError(\r\n \"Please use your terminal's paste functionality or type the API key manually\",\r\n )\r\n return\r\n }\r\n\r\n if (currentScreen === 'modelParams' && key.tab) {\r\n const formFields = getFormFieldsForModelParams()\r\n setActiveFieldIndex(current => (current + 1) % formFields.length)\r\n return\r\n }\r\n\r\n if (currentScreen === 'modelParams' && key.return) {\r\n const formFields = getFormFieldsForModelParams()\r\n const currentField = formFields[activeFieldIndex]\r\n\r\n if (\r\n currentField.name === 'submit' ||\r\n activeFieldIndex === formFields.length - 1\r\n ) {\r\n handleModelParamsSubmit()\r\n } else if (currentField.component === 'select') {\r\n setActiveFieldIndex(current =>\r\n Math.min(current + 1, formFields.length - 1),\r\n )\r\n }\r\n return\r\n }\r\n })\r\n\r\n function getFormFieldsForModelParams() {\r\n return [\r\n {\r\n name: 'maxTokens',\r\n label: 'Maximum Tokens',\r\n description: 'Select the maximum number of tokens to generate.',\r\n value: parseInt(maxTokens),\r\n component: 'select',\r\n options: MAX_TOKENS_OPTIONS.map(option => ({\r\n label: option.label,\r\n value: option.value.toString(),\r\n })),\r\n defaultValue: maxTokens,\r\n },\r\n ...(supportsReasoningEffort\r\n ? [\r\n {\r\n name: 'reasoningEffort',\r\n label: 'Reasoning Effort',\r\n description: 'Controls reasoning depth for complex problems.',\r\n value: reasoningEffort,\r\n component: 'select',\r\n },\r\n ]\r\n : []),\r\n {\r\n name: 'submit',\r\n label: 'Continue \u2192',\r\n component: 'button',\r\n },\r\n ]\r\n }\r\n\r\n if (currentScreen === 'apiKey') {\r\n const modelTypeText = 'this model profile'\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n API Key Setup{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>\r\n Enter your {getProviderLabel(selectedProvider, 0).split(' (')[0]}{' '}\r\n API key for {modelTypeText}:\r\n </Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n This key will be stored locally and used to access the{' '}\r\n {selectedProvider} API.\r\n <Newline />\r\n Your key is never sent to our servers.\r\n <Newline />\r\n <Newline />\r\n {selectedProvider === 'kimi' && (\r\n <>\r\n \uD83D\uDCA1 Get your API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://platform.moonshot.cn/console/api-keys\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'deepseek' && (\r\n <>\r\n \uD83D\uDCA1 Get your API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://platform.deepseek.com/api_keys\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'siliconflow' && (\r\n <>\r\n \uD83D\uDCA1 Get your API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://cloud.siliconflow.cn/i/oJWsm6io\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'qwen' && (\r\n <>\r\n \uD83D\uDCA1 Get your API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://bailian.console.aliyun.com/?tab=model#/api-key\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'glm' && (\r\n <>\r\n \uD83D\uDCA1 Get your API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://open.bigmodel.cn (API Keys section)\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'glm-coding' && (\r\n <>\r\n \uD83D\uDCA1 This is for GLM Coding Plan API.{' '}\r\n <Text color={theme.suggestion}>\r\n Use the same API key as regular GLM\r\n </Text>\r\n <Newline />\r\n <Text dimColor>\r\n Note: This uses a special endpoint for coding tasks.\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'minimax' && (\r\n <>\r\n \uD83D\uDCA1 Get your API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://www.minimax.io/platform/user-center/basic-information\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'minimax-coding' && (\r\n <>\r\n \uD83D\uDCA1 Get your Coding Plan API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://platform.minimaxi.com/user-center/payment/coding-plan\r\n </Text>\r\n <Newline />\r\n <Text dimColor>\r\n Note: This requires a MiniMax Coding Plan subscription.\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'baidu-qianfan' && (\r\n <>\r\n \uD83D\uDCA1 Get your API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://console.bce.baidu.com/iam/#/iam/accesslist\r\n </Text>\r\n </>\r\n )}\r\n {selectedProvider === 'anthropic' && (\r\n <>\uD83D\uDCA1 Get your API key from your provider dashboard.</>\r\n )}\r\n {selectedProvider === 'openai' && (\r\n <>\r\n \uD83D\uDCA1 Get your API key from:{' '}\r\n <Text color={theme.suggestion}>\r\n https://platform.openai.com/api-keys\r\n </Text>\r\n </>\r\n )}\r\n </Text>\r\n </Box>\r\n\r\n <Box flexDirection=\"column\">\r\n <Box>\r\n <TextInput\r\n placeholder=\"Paste your API key here...\"\r\n value={apiKey}\r\n onChange={handleApiKeyChange}\r\n onSubmit={handleApiKeySubmit}\r\n onPaste={handleApiKeyChange}\r\n mask=\"*\"\r\n columns={80}\r\n cursorOffset={cursorOffset}\r\n onChangeCursorOffset={handleCursorOffsetChange}\r\n showCursor={true}\r\n />\r\n </Box>\r\n\r\n {apiKey && (\r\n <Box marginTop={1}>\r\n <Text color={theme.secondaryText}>\r\n Key: {formatApiKeyDisplay(apiKey)} ({apiKey.length} chars)\r\n </Text>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n {apiKeyCleanedNotification && (\r\n <Box marginTop={1}>\r\n <Text color={theme.success}>\r\n \u2713 API key cleaned: removed line breaks and trimmed whitespace\r\n </Text>\r\n </Box>\r\n )}\r\n\r\n <Box marginTop={1}>\r\n <Text>\r\n <Text color={theme.suggestion} dimColor={!apiKey}>\r\n [Submit API Key]\r\n </Text>\r\n <Text> - Press Enter to validate and continue</Text>\r\n </Text>\r\n </Box>\r\n\r\n {isLoadingModels && (\r\n <Box marginTop={1}>\r\n <Text color={theme.suggestion}>\r\n Validating API key and fetching models...\r\n </Text>\r\n {providerBaseUrl && (\r\n <Text dimColor>Endpoint: {providerBaseUrl}/v1/models</Text>\r\n )}\r\n </Box>\r\n )}\r\n\r\n {modelLoadError && (\r\n <Box marginTop={1} flexDirection=\"column\">\r\n <Text color=\"red\">\u274C API Key Validation Failed</Text>\r\n <Text color=\"red\">{modelLoadError}</Text>\r\n {providerBaseUrl && (\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Attempted endpoint: {providerBaseUrl}/v1/models\r\n </Text>\r\n </Box>\r\n )}\r\n <Box marginTop={1}>\r\n <Text color={theme.warning}>\r\n Please check your API key and try again.\r\n </Text>\r\n </Box>\r\n </Box>\r\n )}\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Enter</Text> to continue,{' '}\r\n <Text color={theme.suggestion}>Tab</Text> to{' '}\r\n {selectedProvider === 'anthropic' ||\r\n selectedProvider === 'kimi' ||\r\n selectedProvider === 'deepseek' ||\r\n selectedProvider === 'qwen' ||\r\n selectedProvider === 'glm' ||\r\n selectedProvider === 'glm-coding' ||\r\n selectedProvider === 'minimax' ||\r\n selectedProvider === 'minimax-coding' ||\r\n selectedProvider === 'baidu-qianfan' ||\r\n selectedProvider === 'siliconflow' ||\r\n selectedProvider === 'custom-openai'\r\n ? 'skip to manual model input'\r\n : 'skip using a key'}\r\n , or <Text color={theme.suggestion}>Esc</Text> to go back\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'model') {\r\n const modelTypeText = 'this model profile'\r\n\r\n return (\r\n <ModelSelectionScreen\r\n theme={theme}\r\n exitState={exitState}\r\n providerLabel={getProviderLabel(\r\n selectedProvider,\r\n availableModels.length,\r\n ).split(' (')[0]!}\r\n modelTypeText={modelTypeText}\r\n availableModels={availableModels}\r\n modelSearchQuery={modelSearchQuery}\r\n onModelSearchChange={handleModelSearchChange}\r\n modelSearchCursorOffset={modelSearchCursorOffset}\r\n onModelSearchCursorOffsetChange={handleModelSearchCursorOffsetChange}\r\n onModelSelect={handleModelSelection}\r\n />\r\n )\r\n }\r\n\r\n if (currentScreen === 'modelParams') {\r\n const formFields = getFormFieldsForModelParams()\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n Model Parameters{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>Configure parameters for {selectedModel}:</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n Use <Text color={theme.suggestion}>Tab</Text> to navigate\r\n between fields. Press{' '}\r\n <Text color={theme.suggestion}>Enter</Text> to submit.\r\n </Text>\r\n </Box>\r\n\r\n <Box flexDirection=\"column\">\r\n {formFields.map((field, index) => (\r\n <Box flexDirection=\"column\" marginY={1} key={field.name}>\r\n {field.component !== 'button' ? (\r\n <>\r\n <Text\r\n bold\r\n color={\r\n activeFieldIndex === index ? theme.success : undefined\r\n }\r\n >\r\n {field.label}\r\n </Text>\r\n {field.description && (\r\n <Text color={theme.secondaryText}>\r\n {field.description}\r\n </Text>\r\n )}\r\n </>\r\n ) : (\r\n <Text\r\n bold\r\n color={\r\n activeFieldIndex === index ? theme.success : undefined\r\n }\r\n >\r\n {field.label}\r\n </Text>\r\n )}\r\n <Box marginY={1}>\r\n {activeFieldIndex === index ? (\r\n field.component === 'select' ? (\r\n field.name === 'maxTokens' ? (\r\n <Select\r\n options={field.options || []}\r\n onChange={value => {\r\n const numValue = parseInt(value)\r\n setMaxTokens(numValue.toString())\r\n setSelectedMaxTokensPreset(numValue)\r\n setMaxTokensCursorOffset(\r\n numValue.toString().length,\r\n )\r\n setTimeout(() => {\r\n setActiveFieldIndex(index + 1)\r\n }, 100)\r\n }}\r\n defaultValue={field.defaultValue}\r\n visibleOptionCount={10}\r\n />\r\n ) : (\r\n <Select\r\n options={reasoningEffortOptions}\r\n onChange={value => {\r\n setReasoningEffort(value as ReasoningEffortOption)\r\n setTimeout(() => {\r\n setActiveFieldIndex(index + 1)\r\n }, 100)\r\n }}\r\n defaultValue={reasoningEffort}\r\n visibleOptionCount={8}\r\n />\r\n )\r\n ) : null\r\n ) : field.name === 'maxTokens' ? (\r\n <Text color={theme.secondaryText}>\r\n Current:{' '}\r\n <Text color={theme.suggestion}>\r\n {MAX_TOKENS_OPTIONS.find(\r\n opt => opt.value === parseInt(maxTokens),\r\n )?.label || `${maxTokens} tokens`}\r\n </Text>\r\n </Text>\r\n ) : field.name === 'reasoningEffort' ? (\r\n <Text color={theme.secondaryText}>\r\n Current:{' '}\r\n <Text color={theme.suggestion}>{reasoningEffort}</Text>\r\n </Text>\r\n ) : null}\r\n </Box>\r\n </Box>\r\n ))}\r\n\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Tab</Text> to navigate,{' '}\r\n <Text color={theme.suggestion}>Enter</Text> to continue, or{' '}\r\n <Text color={theme.suggestion}>Esc</Text> to go back\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'resourceName') {\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n Azure Resource Setup{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>Enter your Azure OpenAI resource name:</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n This is the name of your Azure OpenAI resource (without the full\r\n domain).\r\n <Newline />\r\n For example, if your endpoint is\r\n \"https://myresource.openai.azure.com\", enter \"myresource\".\r\n </Text>\r\n </Box>\r\n\r\n <Box>\r\n <TextInput\r\n placeholder=\"myazureresource\"\r\n value={resourceName}\r\n onChange={setResourceName}\r\n onSubmit={handleResourceNameSubmit}\r\n columns={100}\r\n cursorOffset={resourceNameCursorOffset}\r\n onChangeCursorOffset={setResourceNameCursorOffset}\r\n showCursor={true}\r\n />\r\n </Box>\r\n\r\n <Box marginTop={1}>\r\n <Text>\r\n <Text color={theme.suggestion} dimColor={!resourceName}>\r\n [Submit Resource Name]\r\n </Text>\r\n <Text> - Press Enter or click to continue</Text>\r\n </Text>\r\n </Box>\r\n\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\r\n <Text color={theme.suggestion}>Esc</Text> to go back\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'baseUrl') {\r\n const isCustomOpenAI = selectedProvider === 'custom-openai'\r\n\r\n if (isCustomOpenAI) {\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n Custom API Server Setup{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>Enter your custom API URL:</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n This is the base URL for your OpenAI-compatible API.\r\n <Newline />\r\n For example: https://api.example.com/v1\r\n </Text>\r\n </Box>\r\n\r\n <Box>\r\n <TextInput\r\n placeholder=\"https://api.example.com/v1\"\r\n value={customBaseUrl}\r\n onChange={setCustomBaseUrl}\r\n onSubmit={handleCustomBaseUrlSubmit}\r\n columns={100}\r\n cursorOffset={customBaseUrlCursorOffset}\r\n onChangeCursorOffset={setCustomBaseUrlCursorOffset}\r\n showCursor={!isLoadingModels}\r\n focus={!isLoadingModels}\r\n />\r\n </Box>\r\n\r\n <Box marginTop={1}>\r\n <Text>\r\n <Text\r\n color={\r\n isLoadingModels ? theme.secondaryText : theme.suggestion\r\n }\r\n >\r\n [Submit Base URL]\r\n </Text>\r\n <Text> - Press Enter or click to continue</Text>\r\n </Text>\r\n </Box>\r\n\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Enter</Text> to continue\r\n or <Text color={theme.suggestion}>Esc</Text> to go back\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n const providerName = providers[selectedProvider]?.name || selectedProvider\r\n const defaultUrl = providers[selectedProvider]?.baseURL || ''\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n {providerName} API Configuration{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>Configure the API endpoint for {providerName}:</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n {selectedProvider === 'ollama' ? (\r\n <>\r\n This is the URL of your Ollama server.\r\n <Newline />\r\n Default is http://localhost:11434/v1 for local Ollama\r\n installations.\r\n </>\r\n ) : (\r\n <>\r\n This is the base URL for the {providerName} API.\r\n <Newline />\r\n You can modify this URL or press Enter to use the default.\r\n </>\r\n )}\r\n </Text>\r\n </Box>\r\n\r\n <Box>\r\n <TextInput\r\n placeholder={defaultUrl}\r\n value={providerBaseUrl}\r\n onChange={setProviderBaseUrl}\r\n onSubmit={handleProviderBaseUrlSubmit}\r\n columns={100}\r\n cursorOffset={providerBaseUrlCursorOffset}\r\n onChangeCursorOffset={setProviderBaseUrlCursorOffset}\r\n showCursor={!isLoadingModels}\r\n focus={!isLoadingModels}\r\n />\r\n </Box>\r\n\r\n <Box marginTop={1}>\r\n <Text>\r\n <Text\r\n color={\r\n isLoadingModels ? theme.secondaryText : theme.suggestion\r\n }\r\n >\r\n [Submit Base URL]\r\n </Text>\r\n <Text> - Press Enter or click to continue</Text>\r\n </Text>\r\n </Box>\r\n\r\n {isLoadingModels && (\r\n <Box marginTop={1}>\r\n <Text color={theme.success}>\r\n {selectedProvider === 'ollama'\r\n ? 'Connecting to Ollama server...'\r\n : `Connecting to ${providerName}...`}\r\n </Text>\r\n </Box>\r\n )}\r\n\r\n {modelLoadError && (\r\n <Box marginTop={1}>\r\n <Text color=\"red\">Error: {modelLoadError}</Text>\r\n </Box>\r\n )}\r\n\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\r\n <Text color={theme.suggestion}>Esc</Text> to go back\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'modelInput') {\r\n const modelTypeText = 'this model profile'\r\n\r\n let screenTitle = 'Manual Model Setup'\r\n let description = 'Enter the model name manually'\r\n let placeholder = 'gpt-4'\r\n let examples = 'For example: \"gpt-4\", \"gpt-3.5-turbo\", etc.'\r\n\r\n if (selectedProvider === 'azure') {\r\n screenTitle = 'Azure Model Setup'\r\n description = `Enter your Azure OpenAI deployment name for ${modelTypeText}:`\r\n examples = 'For example: \"gpt-4\", \"gpt-35-turbo\", etc.'\r\n placeholder = 'gpt-4'\r\n } else if (selectedProvider === 'anthropic') {\r\n screenTitle = 'Model Setup'\r\n description = `Enter the model name for ${modelTypeText}:`\r\n examples =\r\n 'For example: \"claude-3-5-sonnet-latest\", \"claude-3-5-haiku-latest\", etc.'\r\n placeholder = 'claude-3-5-sonnet-latest'\r\n } else if (selectedProvider === 'bigdream') {\r\n screenTitle = 'BigDream Model Setup'\r\n description = `Enter the BigDream model name for ${modelTypeText}:`\r\n examples =\r\n 'For example: \"claude-3-5-sonnet-latest\", \"claude-3-5-haiku-latest\", etc.'\r\n placeholder = 'claude-3-5-sonnet-latest'\r\n } else if (selectedProvider === 'kimi') {\r\n screenTitle = 'Kimi Model Setup'\r\n description = `Enter the Kimi model name for ${modelTypeText}:`\r\n examples = 'For example: \"kimi-k2-0711-preview\"'\r\n placeholder = 'kimi-k2-0711-preview'\r\n } else if (selectedProvider === 'deepseek') {\r\n screenTitle = 'DeepSeek Model Setup'\r\n description = `Enter the DeepSeek model name for ${modelTypeText}:`\r\n examples =\r\n 'For example: \"deepseek-chat\", \"deepseek-coder\", \"deepseek-reasoner\", etc.'\r\n placeholder = 'deepseek-chat'\r\n } else if (selectedProvider === 'siliconflow') {\r\n screenTitle = 'SiliconFlow Model Setup'\r\n description = `Enter the SiliconFlow model name for ${modelTypeText}:`\r\n examples =\r\n 'For example: \"Qwen/Qwen2.5-72B-Instruct\", \"meta-llama/Meta-Llama-3.1-8B-Instruct\", etc.'\r\n placeholder = 'Qwen/Qwen2.5-72B-Instruct'\r\n } else if (selectedProvider === 'qwen') {\r\n screenTitle = 'Qwen Model Setup'\r\n description = `Enter the Qwen model name for ${modelTypeText}:`\r\n examples = 'For example: \"qwen-plus\", \"qwen-turbo\", \"qwen-max\", etc.'\r\n placeholder = 'qwen-plus'\r\n } else if (selectedProvider === 'glm') {\r\n screenTitle = 'GLM Model Setup'\r\n description = `Enter the GLM model name for ${modelTypeText}:`\r\n examples = 'For example: \"glm-4\", \"glm-4v\", \"glm-3-turbo\", etc.'\r\n placeholder = 'glm-4'\r\n } else if (selectedProvider === 'glm-coding') {\r\n screenTitle = 'GLM Coding Plan Model Setup'\r\n description = `Enter the GLM model name for ${modelTypeText}:`\r\n examples = 'For Coding Plan, typically use: \"GLM-4.6\" or other GLM models'\r\n placeholder = 'GLM-4.6'\r\n } else if (selectedProvider === 'minimax') {\r\n screenTitle = 'MiniMax Model Setup'\r\n description = `Enter the MiniMax model name for ${modelTypeText}:`\r\n examples =\r\n 'For example: \"abab6.5s-chat\", \"abab6.5g-chat\", \"abab5.5s-chat\", etc.'\r\n placeholder = 'abab6.5s-chat'\r\n } else if (selectedProvider === 'minimax-coding') {\r\n screenTitle = 'MiniMax Coding Plan Model Setup'\r\n description = `Enter the MiniMax model name for ${modelTypeText}:`\r\n examples = 'For Coding Plan, use: \"MiniMax-M2\"'\r\n placeholder = 'MiniMax-M2'\r\n } else if (selectedProvider === 'baidu-qianfan') {\r\n screenTitle = 'Baidu Qianfan Model Setup'\r\n description = `Enter the Baidu Qianfan model name for ${modelTypeText}:`\r\n examples =\r\n 'For example: \"ERNIE-4.0-8K\", \"ERNIE-3.5-8K\", \"ERNIE-Speed-128K\", etc.'\r\n placeholder = 'ERNIE-4.0-8K'\r\n } else if (selectedProvider === 'custom-openai') {\r\n screenTitle = 'Custom API Model Setup'\r\n description = `Enter the model name for ${modelTypeText}:`\r\n examples = 'Enter the exact model name as supported by your API endpoint.'\r\n placeholder = 'model-name'\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n {screenTitle}{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>{description}</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n {selectedProvider === 'azure'\r\n ? 'This is the deployment name you configured in your Azure OpenAI resource.'\r\n : selectedProvider === 'anthropic'\r\n ? 'This should match a model identifier supported by your API endpoint.'\r\n : selectedProvider === 'bigdream'\r\n ? 'This should be a valid model identifier supported by BigDream.'\r\n : selectedProvider === 'kimi'\r\n ? 'This should be a valid Kimi model identifier from Moonshot AI.'\r\n : selectedProvider === 'deepseek'\r\n ? 'This should be a valid DeepSeek model identifier.'\r\n : selectedProvider === 'siliconflow'\r\n ? 'This should be a valid SiliconFlow model identifier.'\r\n : selectedProvider === 'qwen'\r\n ? 'This should be a valid Qwen model identifier from Alibaba Cloud.'\r\n : selectedProvider === 'glm'\r\n ? 'This should be a valid GLM model identifier from Zhipu AI.'\r\n : selectedProvider === 'minimax'\r\n ? 'This should be a valid MiniMax model identifier.'\r\n : selectedProvider === 'baidu-qianfan'\r\n ? 'This should be a valid Baidu Qianfan model identifier.'\r\n : 'This should match the model name supported by your API endpoint.'}\r\n <Newline />\r\n {examples}\r\n </Text>\r\n </Box>\r\n\r\n <Box>\r\n <TextInput\r\n placeholder={placeholder}\r\n value={customModelName}\r\n onChange={setCustomModelName}\r\n onSubmit={handleCustomModelSubmit}\r\n columns={100}\r\n cursorOffset={customModelNameCursorOffset}\r\n onChangeCursorOffset={setCustomModelNameCursorOffset}\r\n showCursor={true}\r\n />\r\n </Box>\r\n\r\n <Box marginTop={1}>\r\n <Text>\r\n <Text color={theme.suggestion} dimColor={!customModelName}>\r\n [Submit Model Name]\r\n </Text>\r\n <Text> - Press Enter or click to continue</Text>\r\n </Text>\r\n </Box>\r\n\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\r\n <Text color={theme.suggestion}>Esc</Text> to go back\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'contextLength') {\r\n const selectedOption =\r\n CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength) ||\r\n CONTEXT_LENGTH_OPTIONS[2]\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n Context Length Configuration{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>Choose the context window length for your model:</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n This determines how much conversation history and context the\r\n model can process at once. Higher values allow for longer\r\n conversations but may increase costs.\r\n </Text>\r\n </Box>\r\n\r\n <Box flexDirection=\"column\" marginY={1}>\r\n {CONTEXT_LENGTH_OPTIONS.map((option, index) => {\r\n const isSelected = option.value === contextLength\r\n return (\r\n <Box key={option.value} flexDirection=\"row\">\r\n <Text color={isSelected ? 'blue' : undefined}>\r\n {isSelected ? '\u2192 ' : ' '}\r\n {option.label}\r\n {option.value === DEFAULT_CONTEXT_LENGTH\r\n ? ' (recommended)'\r\n : ''}\r\n </Text>\r\n </Box>\r\n )\r\n })}\r\n </Box>\r\n\r\n <Box flexDirection=\"column\" marginY={1}>\r\n <Text dimColor>\r\n Selected:{' '}\r\n <Text color={theme.suggestion}>{selectedOption.label}</Text>\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n <Box marginLeft={1}>\r\n <Text dimColor>\r\n \u2191/\u2193 to select \u00B7 Enter to continue \u00B7 Esc to go back\r\n </Text>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'connectionTest') {\r\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\r\n ' (',\r\n )[0]\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n Connection Test{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>Testing connection to {providerDisplayName}...</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n This will verify your configuration by sending a test request to\r\n the API.\r\n {selectedProvider === 'minimax' && (\r\n <>\r\n <Newline />\r\n For MiniMax, we'll test both v2 and v1 endpoints to find the\r\n best one.\r\n </>\r\n )}\r\n </Text>\r\n </Box>\r\n\r\n {!connectionTestResult && !isTestingConnection && (\r\n <Box marginY={1}>\r\n <Text>\r\n <Text color={theme.suggestion}>Press Enter</Text> to start the\r\n connection test\r\n </Text>\r\n </Box>\r\n )}\r\n\r\n {isTestingConnection && (\r\n <Box marginY={1}>\r\n <Text color={theme.suggestion}>\uD83D\uDD04 Testing connection...</Text>\r\n </Box>\r\n )}\r\n\r\n {connectionTestResult && (\r\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\r\n <Text\r\n color={connectionTestResult.success ? theme.success : 'red'}\r\n >\r\n {connectionTestResult.message}\r\n </Text>\r\n\r\n {connectionTestResult.endpoint && (\r\n <Text color={theme.secondaryText}>\r\n Endpoint: {connectionTestResult.endpoint}\r\n </Text>\r\n )}\r\n\r\n {connectionTestResult.details && (\r\n <Text color={theme.secondaryText}>\r\n Details: {connectionTestResult.details}\r\n </Text>\r\n )}\r\n\r\n {connectionTestResult.success ? (\r\n <Box marginTop={1}>\r\n <Text color={theme.success}>\r\n \u2705 Automatically proceeding to confirmation...\r\n </Text>\r\n </Box>\r\n ) : (\r\n <Box marginTop={1}>\r\n <Text>\r\n <Text color={theme.suggestion}>Press Enter</Text> to retry\r\n test, or <Text color={theme.suggestion}>Esc</Text> to go\r\n back\r\n </Text>\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\r\n context length\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'confirmation') {\r\n\r\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\r\n ' (',\r\n )[0]\r\n\r\n const showsApiKey = selectedProvider !== 'ollama'\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n Configuration Confirmation{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>Confirm your model configuration:</Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n Please review your selections before saving.\r\n </Text>\r\n </Box>\r\n\r\n {validationError && (\r\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\r\n <Text color={theme.error} bold>\r\n \u26A0 Configuration Error:\r\n </Text>\r\n <Text color={theme.error}>{validationError}</Text>\r\n </Box>\r\n )}\r\n\r\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\r\n <Text>\r\n <Text bold>Provider: </Text>\r\n <Text color={theme.suggestion}>{providerDisplayName}</Text>\r\n </Text>\r\n\r\n {selectedProvider === 'azure' && (\r\n <Text>\r\n <Text bold>Resource Name: </Text>\r\n <Text color={theme.suggestion}>{resourceName}</Text>\r\n </Text>\r\n )}\r\n\r\n {selectedProvider === 'ollama' && (\r\n <Text>\r\n <Text bold>Server URL: </Text>\r\n <Text color={theme.suggestion}>{ollamaBaseUrl}</Text>\r\n </Text>\r\n )}\r\n\r\n {selectedProvider === 'custom-openai' && (\r\n <Text>\r\n <Text bold>API Base URL: </Text>\r\n <Text color={theme.suggestion}>{customBaseUrl}</Text>\r\n </Text>\r\n )}\r\n\r\n <Text>\r\n <Text bold>Model: </Text>\r\n <Text color={theme.suggestion}>{selectedModel}</Text>\r\n </Text>\r\n\r\n {apiKey && showsApiKey && (\r\n <Text>\r\n <Text bold>API Key: </Text>\r\n <Text color={theme.suggestion}>\r\n {formatApiKeyDisplay(apiKey)}\r\n </Text>\r\n </Text>\r\n )}\r\n\r\n {maxTokens && (\r\n <Text>\r\n <Text bold>Max Tokens: </Text>\r\n <Text color={theme.suggestion}>{maxTokens}</Text>\r\n </Text>\r\n )}\r\n\r\n <Text>\r\n <Text bold>Context Length: </Text>\r\n <Text color={theme.suggestion}>\r\n {CONTEXT_LENGTH_OPTIONS.find(\r\n opt => opt.value === contextLength,\r\n )?.label || `${contextLength.toLocaleString()} tokens`}\r\n </Text>\r\n </Text>\r\n\r\n {supportsReasoningEffort && (\r\n <Text>\r\n <Text bold>Reasoning Effort: </Text>\r\n <Text color={theme.suggestion}>{reasoningEffort}</Text>\r\n </Text>\r\n )}\r\n </Box>\r\n\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\r\n model parameters or <Text color={theme.suggestion}>Enter</Text>{' '}\r\n to save configuration\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'partnerProviders') {\r\n const footerMarginTop = tightLayout ? 0 : 1\r\n return (\r\n <Box flexDirection=\"column\" gap={containerGap}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={containerGap}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={containerPaddingY}\r\n >\r\n <Text bold>\r\n Partner Providers{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={containerGap}>\r\n <Text bold>\r\n Select a partner AI provider for this model profile:\r\n </Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n {compactLayout\r\n ? 'Choose an official partner provider.'\r\n : 'Choose from official partner providers to access their models and services.'}\r\n </Text>\r\n </Box>\r\n\r\n <WindowedOptions\r\n options={partnerProviderOptions}\r\n focusedIndex={partnerProviderFocusIndex}\r\n maxVisible={getSafeVisibleOptionCount(\r\n 6,\r\n partnerProviderOptions.length,\r\n partnerReservedLines,\r\n )}\r\n theme={theme}\r\n />\r\n\r\n <Box marginTop={footerMarginTop}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\r\n main menu\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n if (currentScreen === 'partnerCodingPlans') {\r\n const footerMarginTop = tightLayout ? 0 : 1\r\n return (\r\n <Box flexDirection=\"column\" gap={containerGap}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={containerGap}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={containerPaddingY}\r\n >\r\n <Text bold>\r\n Partner Coding Plans{' '}\r\n {exitState.pending\r\n ? `(press ${exitState.keyName} again to exit)`\r\n : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={containerGap}>\r\n <Text bold>\r\n Select a partner coding plan for specialized programming\r\n assistance:\r\n </Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n {compactLayout ? (\r\n 'Specialized coding models from partners.'\r\n ) : (\r\n <>\r\n These are specialized models optimized for coding and\r\n development tasks.\r\n <Newline />\r\n They require specific coding plan subscriptions from the\r\n respective providers.\r\n </>\r\n )}\r\n </Text>\r\n </Box>\r\n\r\n <WindowedOptions\r\n options={codingPlanOptions}\r\n focusedIndex={codingPlanFocusIndex}\r\n maxVisible={getSafeVisibleOptionCount(\r\n 5,\r\n codingPlanOptions.length,\r\n codingReservedLines,\r\n )}\r\n theme={theme}\r\n />\r\n\r\n <Box marginTop={footerMarginTop}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\r\n main menu\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n return (\r\n <ScreenContainer\r\n title=\"Provider Selection\"\r\n exitState={exitState}\r\n paddingY={containerPaddingY}\r\n gap={containerGap}\r\n children={\r\n <Box flexDirection=\"column\" gap={containerGap}>\r\n <Text bold>\r\n Select your preferred AI provider for this model profile:\r\n </Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n {compactLayout ? (\r\n 'Choose the provider to use for this profile.'\r\n ) : (\r\n <>\r\n Choose the provider you want to use for this model profile.\r\n <Newline />\r\n This will determine which models are available to you.\r\n </>\r\n )}\r\n </Text>\r\n </Box>\r\n\r\n <WindowedOptions\r\n options={mainMenuOptions}\r\n focusedIndex={providerFocusIndex}\r\n maxVisible={getSafeVisibleOptionCount(\r\n 5,\r\n mainMenuOptions.length,\r\n providerReservedLines,\r\n )}\r\n theme={theme}\r\n />\r\n\r\n <Box marginTop={tightLayout ? 0 : 1}>\r\n <Text dimColor>\r\n You can change this later by running{' '}\r\n <Text color={theme.suggestion}>/model</Text> again\r\n </Text>\r\n </Box>\r\n </Box>\r\n }\r\n />\r\n )\r\n}\r\n", "\r\nimport { getModelFeatures } from './openai'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\n\r\nexport interface ConnectionTestResult {\r\n success: boolean\r\n message: string\r\n endpoint?: string\r\n details?: string\r\n apiUsed?: 'responses' | 'chat_completions'\r\n responseTime?: number\r\n}\r\n\r\nexport interface GPT5TestConfig {\r\n model: string\r\n apiKey: string\r\n baseURL?: string\r\n maxTokens?: number\r\n provider?: string\r\n}\r\n\r\nexport async function testGPT5Connection(\r\n config: GPT5TestConfig,\r\n): Promise<ConnectionTestResult> {\r\n const startTime = Date.now()\r\n\r\n if (!config.model || !config.apiKey) {\r\n return {\r\n success: false,\r\n message: 'Invalid configuration',\r\n details: 'Model name and API key are required',\r\n }\r\n }\r\n\r\n const isGPT5 = config.model.toLowerCase().includes('gpt-5')\r\n const modelFeatures = getModelFeatures(config.model)\r\n const baseURL = config.baseURL || 'https://api.openai.com/v1'\r\n const isOfficialOpenAI =\r\n !config.baseURL || config.baseURL.includes('api.openai.com')\r\n\r\n debugLogger.api('GPT5_CONNECTION_TEST_START', {\r\n model: config.model,\r\n baseURL,\r\n isOfficialOpenAI,\r\n supportsResponsesAPI: modelFeatures.supportsResponsesAPI,\r\n })\r\n\r\n if (isGPT5 && modelFeatures.supportsResponsesAPI && isOfficialOpenAI) {\r\n debugLogger.api('GPT5_CONNECTION_TEST_TRY_RESPONSES', { model: config.model })\r\n const responsesResult = await testResponsesAPI(config, baseURL, startTime)\r\n\r\n if (responsesResult.success) {\r\n debugLogger.api('GPT5_CONNECTION_TEST_RESPONSES_OK', { model: config.model })\r\n return responsesResult\r\n } else {\r\n debugLogger.warn('GPT5_CONNECTION_TEST_RESPONSES_FAILED', {\r\n model: config.model,\r\n details: responsesResult.details,\r\n })\r\n }\r\n }\r\n\r\n debugLogger.api('GPT5_CONNECTION_TEST_FALLBACK_CHAT_COMPLETIONS', { model: config.model })\r\n return await testChatCompletionsAPI(config, baseURL, startTime)\r\n}\r\n\r\nasync function testResponsesAPI(\r\n config: GPT5TestConfig,\r\n baseURL: string,\r\n startTime: number,\r\n): Promise<ConnectionTestResult> {\r\n const testURL = `${baseURL.replace(/\\/+$/, '')}/responses`\r\n\r\n const testPayload = {\r\n model: config.model,\r\n input: [\r\n {\r\n role: 'user',\r\n content:\r\n 'Please respond with exactly \"YES\" (in capital letters) to confirm this connection is working.',\r\n },\r\n ],\r\n max_completion_tokens: Math.max(config.maxTokens || 8192, 8192),\r\n temperature: 1,\r\n reasoning: {\r\n effort: 'low',\r\n },\r\n }\r\n\r\n const headers = {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${config.apiKey}`,\r\n }\r\n\r\n debugLogger.api('GPT5_CONNECTION_TEST_RESPONSES_REQUEST', {\r\n model: config.model,\r\n url: testURL,\r\n })\r\n\r\n try {\r\n const response = await fetch(testURL, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(testPayload),\r\n })\r\n\r\n const responseTime = Date.now() - startTime\r\n\r\n if (response.ok) {\r\n const data = await response.json()\r\n debugLogger.api('GPT5_CONNECTION_TEST_RESPONSES_RESPONSE', {\r\n model: config.model,\r\n status: response.status,\r\n })\r\n\r\n let responseContent = ''\r\n if (data.output_text) {\r\n responseContent = data.output_text\r\n } else if (data.output && Array.isArray(data.output)) {\r\n const messageOutput = data.output.find(item => item.type === 'message')\r\n if (messageOutput && messageOutput.content) {\r\n const textContent = messageOutput.content.find(\r\n c => c.type === 'output_text',\r\n )\r\n responseContent = textContent?.text || ''\r\n }\r\n }\r\n\r\n const containsYes = responseContent.toLowerCase().includes('yes')\r\n\r\n if (containsYes) {\r\n return {\r\n success: true,\r\n message: '\u2705 GPT-5 Responses API connection successful',\r\n endpoint: '/responses',\r\n details: `Model responded correctly: \"${responseContent.trim()}\"`,\r\n apiUsed: 'responses',\r\n responseTime,\r\n }\r\n } else {\r\n return {\r\n success: false,\r\n message: '\u26A0\uFE0F Responses API connected but unexpected response',\r\n endpoint: '/responses',\r\n details: `Expected \"YES\" but got: \"${responseContent.trim() || '(empty response)'}\"`,\r\n apiUsed: 'responses',\r\n responseTime,\r\n }\r\n }\r\n } else {\r\n const errorData = await response.json().catch(() => null)\r\n const errorMessage =\r\n errorData?.error?.message || errorData?.message || response.statusText\r\n\r\n debugLogger.warn('GPT5_CONNECTION_TEST_RESPONSES_ERROR', {\r\n model: config.model,\r\n status: response.status,\r\n error: errorMessage,\r\n })\r\n\r\n return {\r\n success: false,\r\n message: `\u274C Responses API failed (${response.status})`,\r\n endpoint: '/responses',\r\n details: `Error: ${errorMessage}`,\r\n apiUsed: 'responses',\r\n responseTime: Date.now() - startTime,\r\n }\r\n }\r\n } catch (error) {\r\n debugLogger.warn('GPT5_CONNECTION_TEST_RESPONSES_NETWORK_ERROR', {\r\n model: config.model,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n\r\n return {\r\n success: false,\r\n message: '\u274C Responses API connection failed',\r\n endpoint: '/responses',\r\n details: error instanceof Error ? error.message : String(error),\r\n apiUsed: 'responses',\r\n responseTime: Date.now() - startTime,\r\n }\r\n }\r\n}\r\n\r\nasync function testChatCompletionsAPI(\r\n config: GPT5TestConfig,\r\n baseURL: string,\r\n startTime: number,\r\n): Promise<ConnectionTestResult> {\r\n const testURL = `${baseURL.replace(/\\/+$/, '')}/chat/completions`\r\n\r\n const isGPT5 = config.model.toLowerCase().includes('gpt-5')\r\n\r\n const testPayload: any = {\r\n model: config.model,\r\n messages: [\r\n {\r\n role: 'user',\r\n content:\r\n 'Please respond with exactly \"YES\" (in capital letters) to confirm this connection is working.',\r\n },\r\n ],\r\n temperature: isGPT5 ? 1 : 0,\r\n stream: false,\r\n }\r\n\r\n if (isGPT5) {\r\n testPayload.max_completion_tokens = Math.max(config.maxTokens || 8192, 8192)\r\n delete testPayload.max_tokens\r\n debugLogger.api('GPT5_CONNECTION_TEST_MAX_COMPLETION_TOKENS', {\r\n model: config.model,\r\n max_completion_tokens: testPayload.max_completion_tokens,\r\n })\r\n } else {\r\n testPayload.max_tokens = Math.max(config.maxTokens || 8192, 8192)\r\n }\r\n\r\n const headers = {\r\n 'Content-Type': 'application/json',\r\n }\r\n\r\n if (config.provider === 'azure') {\r\n headers['api-key'] = config.apiKey\r\n } else {\r\n headers['Authorization'] = `Bearer ${config.apiKey}`\r\n }\r\n\r\n debugLogger.api('GPT5_CONNECTION_TEST_CHAT_COMPLETIONS_REQUEST', {\r\n model: config.model,\r\n url: testURL,\r\n })\r\n\r\n try {\r\n const response = await fetch(testURL, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(testPayload),\r\n })\r\n\r\n const responseTime = Date.now() - startTime\r\n\r\n if (response.ok) {\r\n const data = await response.json()\r\n debugLogger.api('GPT5_CONNECTION_TEST_CHAT_COMPLETIONS_RESPONSE', {\r\n model: config.model,\r\n status: response.status,\r\n })\r\n\r\n const responseContent = data.choices?.[0]?.message?.content || ''\r\n const containsYes = responseContent.toLowerCase().includes('yes')\r\n\r\n if (containsYes) {\r\n return {\r\n success: true,\r\n message: `\u2705 ${isGPT5 ? 'GPT-5' : 'Model'} Chat Completions connection successful`,\r\n endpoint: '/chat/completions',\r\n details: `Model responded correctly: \"${responseContent.trim()}\"`,\r\n apiUsed: 'chat_completions',\r\n responseTime,\r\n }\r\n } else {\r\n return {\r\n success: false,\r\n message: '\u26A0\uFE0F Chat Completions connected but unexpected response',\r\n endpoint: '/chat/completions',\r\n details: `Expected \"YES\" but got: \"${responseContent.trim() || '(empty response)'}\"`,\r\n apiUsed: 'chat_completions',\r\n responseTime,\r\n }\r\n }\r\n } else {\r\n const errorData = await response.json().catch(() => null)\r\n const errorMessage =\r\n errorData?.error?.message || errorData?.message || response.statusText\r\n\r\n debugLogger.warn('GPT5_CONNECTION_TEST_CHAT_COMPLETIONS_ERROR', {\r\n model: config.model,\r\n status: response.status,\r\n error: errorMessage,\r\n })\r\n\r\n let details = `Error: ${errorMessage}`\r\n if (\r\n response.status === 400 &&\r\n errorMessage.includes('max_tokens') &&\r\n isGPT5\r\n ) {\r\n details +=\r\n '\\n\\n\uD83D\uDD27 GPT-5 Fix Applied: This error suggests a parameter compatibility issue. Please check if the provider supports GPT-5 with max_completion_tokens.'\r\n }\r\n\r\n return {\r\n success: false,\r\n message: `\u274C Chat Completions failed (${response.status})`,\r\n endpoint: '/chat/completions',\r\n details: details,\r\n apiUsed: 'chat_completions',\r\n responseTime: Date.now() - startTime,\r\n }\r\n }\r\n } catch (error) {\r\n debugLogger.warn('GPT5_CONNECTION_TEST_CHAT_COMPLETIONS_NETWORK_ERROR', {\r\n model: config.model,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n\r\n return {\r\n success: false,\r\n message: '\u274C Chat Completions connection failed',\r\n endpoint: '/chat/completions',\r\n details: error instanceof Error ? error.message : String(error),\r\n apiUsed: 'chat_completions',\r\n responseTime: Date.now() - startTime,\r\n }\r\n }\r\n}\r\n\r\nexport function validateGPT5Config(config: GPT5TestConfig): {\r\n valid: boolean\r\n errors: string[]\r\n} {\r\n debugLogger.state('GPT5_VALIDATE_CONFIG_CALLED', {\r\n model: config.model,\r\n hasApiKey: !!config.apiKey,\r\n baseURL: config.baseURL,\r\n provider: config.provider,\r\n })\r\n\r\n const errors: string[] = []\r\n\r\n if (!config.model) {\r\n errors.push('Model name is required')\r\n }\r\n\r\n if (!config.apiKey) {\r\n errors.push('API key is required')\r\n }\r\n\r\n const isGPT5 = config.model?.toLowerCase().includes('gpt-5')\r\n if (isGPT5) {\r\n debugLogger.state('GPT5_VALIDATE_CONFIG', {\r\n model: config.model,\r\n maxTokens: config.maxTokens,\r\n })\r\n\r\n if (config.maxTokens && config.maxTokens < 1000) {\r\n errors.push('GPT-5 models typically require at least 1000 max tokens')\r\n }\r\n\r\n debugLogger.state('GPT5_VALIDATE_CONFIG_NO_PROVIDER_RESTRICTIONS', {\r\n model: config.model,\r\n })\r\n }\r\n\r\n debugLogger.state('GPT5_VALIDATE_CONFIG_RESULT', {\r\n valid: errors.length === 0,\r\n errors,\r\n })\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n }\r\n}\r\n", "import React from 'react'\r\nimport { Box, Text } from 'ink'\r\nimport { getTheme } from '@utils/theme'\r\n\r\nexport type ScreenContainerExitState = { pending: boolean; keyName: string }\r\n\r\ntype Props = {\r\n title: string\r\n exitState: ScreenContainerExitState\r\n children: React.ReactNode\r\n paddingY?: number\r\n gap?: number\r\n}\r\n\r\nexport function ScreenContainer({\r\n title,\r\n exitState,\r\n children,\r\n paddingY = 1,\r\n gap = 1,\r\n}: Props) {\r\n const theme = getTheme()\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n gap={gap}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={paddingY}\r\n >\r\n <Text bold>\r\n {title}{' '}\r\n {exitState.pending ? `(press ${exitState.keyName} again to exit)` : ''}\r\n </Text>\r\n {children}\r\n </Box>\r\n )\r\n}\r\n", "export type ReasoningEffortOption = 'low' | 'medium' | 'high'\r\n\r\nexport const REASONING_EFFORT_OPTIONS: Array<{\r\n label: string\r\n value: ReasoningEffortOption\r\n}> = [\r\n { label: 'Low - Faster responses, less thorough reasoning', value: 'low' },\r\n { label: 'Medium - Balanced speed and reasoning depth', value: 'medium' },\r\n {\r\n label: 'High - Slower responses, more thorough reasoning',\r\n value: 'high',\r\n },\r\n]\r\n\r\nexport type ContextLengthOption = {\r\n label: string\r\n value: number\r\n}\r\n\r\nexport const CONTEXT_LENGTH_OPTIONS: ContextLengthOption[] = [\r\n { label: '32K tokens', value: 32000 },\r\n { label: '64K tokens', value: 64000 },\r\n { label: '128K tokens', value: 128000 },\r\n { label: '200K tokens', value: 200000 },\r\n { label: '256K tokens', value: 256000 },\r\n { label: '300K tokens', value: 300000 },\r\n { label: '512K tokens', value: 512000 },\r\n { label: '1000K tokens', value: 1000000 },\r\n { label: '2000K tokens', value: 2000000 },\r\n { label: '3000K tokens', value: 3000000 },\r\n { label: '5000K tokens', value: 5000000 },\r\n { label: '10000K tokens', value: 10000000 },\r\n]\r\n\r\nexport const DEFAULT_CONTEXT_LENGTH = 128000\r\n\r\nexport type MaxTokensOption = {\r\n label: string\r\n value: number\r\n}\r\n\r\nexport const MAX_TOKENS_OPTIONS: MaxTokensOption[] = [\r\n { label: '1K tokens', value: 1024 },\r\n { label: '2K tokens', value: 2048 },\r\n { label: '4K tokens', value: 4096 },\r\n { label: '8K tokens (recommended)', value: 8192 },\r\n { label: '16K tokens', value: 16384 },\r\n { label: '32K tokens', value: 32768 },\r\n { label: '64K tokens', value: 65536 },\r\n { label: '128K tokens', value: 131072 },\r\n]\r\n\r\nexport const DEFAULT_MAX_TOKENS = 8192\r\n", "import chalk from 'chalk'\r\nimport { getGlobalConfig } from '@utils/config'\r\n\r\nexport function printModelConfig() {\r\n const config = getGlobalConfig()\r\n const modelProfiles = config.modelProfiles || []\r\n const activeProfiles = modelProfiles.filter(p => p.isActive)\r\n\r\n if (activeProfiles.length === 0) {\r\n process.stdout.write(`${chalk.gray(' \u23BF No active model profiles configured')}\\n`)\r\n return\r\n }\r\n\r\n const profileSummary = activeProfiles\r\n .map(p => `${p.name} (${p.provider}: ${p.modelName})`)\r\n .join(' | ')\r\n process.stdout.write(`${chalk.gray(` \u23BF ${profileSummary}`)}\\n`)\r\n}\r\n", "import { useRef } from 'react'\r\nimport { useInput } from 'ink'\r\n\r\nexport function useEscapeNavigation(\r\n onEscape: () => void,\r\n _abortController?: AbortController,\r\n) {\r\n const handledRef = useRef(false)\r\n\r\n useInput(\r\n (_input, key) => {\r\n if (key.escape && !handledRef.current) {\r\n handledRef.current = true\r\n setTimeout(() => {\r\n handledRef.current = false\r\n }, 100)\r\n onEscape()\r\n }\r\n },\r\n { isActive: true },\r\n )\r\n}\r\n", "import { fetchCustomModels } from '@services/openai'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\n\r\nimport type { ModelInfo } from './types'\r\n\r\ntype SetModelLoadError = (message: string) => void\r\n\r\nasync function fetchAnthropicModels(baseURL: string, apiKey: string) {\r\n try {\r\n const response = await fetch(`${baseURL}/v1/models`, {\r\n method: 'GET',\r\n headers: {\r\n 'x-api-key': apiKey,\r\n 'anthropic-version': '2023-06-01',\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${apiKey}`,\r\n },\r\n })\r\n\r\n if (!response.ok) {\r\n if (response.status === 401) {\r\n throw new Error(\r\n 'Invalid API key. Please check your API key and try again.',\r\n )\r\n } else if (response.status === 403) {\r\n throw new Error('API key does not have permission to access models.')\r\n } else if (response.status === 404) {\r\n throw new Error(\r\n 'API endpoint not found. This provider may not support model listing.',\r\n )\r\n } else if (response.status === 429) {\r\n throw new Error(\r\n 'Too many requests. Please wait a moment and try again.',\r\n )\r\n } else if (response.status >= 500) {\r\n throw new Error(\r\n 'API service is temporarily unavailable. Please try again later.',\r\n )\r\n } else {\r\n throw new Error(`Unable to connect to API (${response.status}).`)\r\n }\r\n }\r\n\r\n const data = await response.json()\r\n\r\n let models = []\r\n if (data && data.data && Array.isArray(data.data)) {\r\n models = data.data\r\n } else if (Array.isArray(data)) {\r\n models = data\r\n } else if (data && data.models && Array.isArray(data.models)) {\r\n models = data.models\r\n } else {\r\n throw new Error('API returned unexpected response format.')\r\n }\r\n\r\n return models\r\n } catch (error) {\r\n if (\r\n error instanceof Error &&\r\n (error.message.includes('API key') ||\r\n error.message.includes('API endpoint') ||\r\n error.message.includes('API service') ||\r\n error.message.includes('response format'))\r\n ) {\r\n throw error\r\n }\r\n\r\n if (error instanceof Error && error.message.includes('fetch')) {\r\n throw new Error(\r\n 'Unable to connect to the API. Please check the base URL and your internet connection.',\r\n )\r\n }\r\n\r\n throw new Error(\r\n 'Failed to fetch models from API. Please check your configuration and try again.',\r\n )\r\n }\r\n}\r\n\r\nasync function fetchAnthropicCompatibleModelsWithFallback({\r\n baseURL,\r\n provider,\r\n apiKey,\r\n apiKeyUrl,\r\n setModelLoadError,\r\n}: {\r\n baseURL: string\r\n provider: string\r\n apiKey: string\r\n apiKeyUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n let lastError: Error | null = null\r\n\r\n try {\r\n const models = await fetchAnthropicModels(baseURL, apiKey)\r\n return models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: provider,\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: model.supports_vision || true,\r\n supports_function_calling: model.supports_function_calling || true,\r\n supports_reasoning_effort: false,\r\n }))\r\n } catch (error) {\r\n lastError = error as Error\r\n debugLogger.warn('MODEL_FETCH_NATIVE_API_FAILED', {\r\n provider,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n }\r\n\r\n try {\r\n const models = await fetchCustomModels(baseURL, apiKey)\r\n return models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: provider,\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: model.supports_vision || false,\r\n supports_function_calling: model.supports_function_calling || true,\r\n supports_reasoning_effort: false,\r\n }))\r\n } catch (error) {\r\n lastError = error as Error\r\n debugLogger.warn('MODEL_FETCH_OPENAI_API_FAILED', {\r\n provider,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n }\r\n\r\n let errorMessage = `Failed to fetch ${provider} models using both native and OpenAI-compatible API formats`\r\n if (lastError instanceof Error) {\r\n errorMessage = lastError.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage += apiKeyUrl\r\n ? `\\n\\n\uD83D\uDCA1 Tip: Get your API key from ${apiKeyUrl}`\r\n : '\\n\\n\uD83D\uDCA1 Tip: Check that your API key is set and valid for this provider'\r\n } else if (errorMessage.includes('permission')) {\r\n errorMessage += `\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the ${provider} API`\r\n } else if (errorMessage.includes('connection')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw new Error(errorMessage)\r\n}\r\n\r\nexport async function fetchAnthropicCompatibleProviderModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n providerBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n const defaultBaseURL = 'https://api.anthropic.com'\r\n const apiKeyUrl = ''\r\n const actualProvider = 'anthropic'\r\n const baseURL = providerBaseUrl || defaultBaseURL\r\n return await fetchAnthropicCompatibleModelsWithFallback({\r\n baseURL,\r\n provider: actualProvider,\r\n apiKey,\r\n apiKeyUrl,\r\n setModelLoadError,\r\n })\r\n}\r\n\r\nexport async function fetchKimiModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n providerBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n try {\r\n const baseURL = providerBaseUrl || 'https://api.moonshot.cn/v1'\r\n const models = await fetchCustomModels(baseURL, apiKey)\r\n\r\n const kimiModels = models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: 'kimi',\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n return kimiModels\r\n } catch (error) {\r\n let errorMessage = 'Failed to fetch Kimi models'\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://platform.moonshot.cn/console/api-keys'\r\n } else if (errorMessage.includes('permission')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Kimi API'\r\n } else if (errorMessage.includes('connection')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw error\r\n }\r\n}\r\n\r\nexport async function fetchDeepSeekModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n providerBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n try {\r\n const baseURL = providerBaseUrl || 'https://api.deepseek.com'\r\n const models = await fetchCustomModels(baseURL, apiKey)\r\n\r\n const deepseekModels = models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: 'deepseek',\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n return deepseekModels\r\n } catch (error) {\r\n let errorMessage = 'Failed to fetch DeepSeek models'\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://platform.deepseek.com/api_keys'\r\n } else if (errorMessage.includes('permission')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the DeepSeek API'\r\n } else if (errorMessage.includes('connection')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw error\r\n }\r\n}\r\n\r\nexport async function fetchSiliconFlowModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n providerBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n try {\r\n const baseURL = providerBaseUrl || 'https://api.siliconflow.cn/v1'\r\n const models = await fetchCustomModels(baseURL, apiKey)\r\n\r\n const siliconflowModels = models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: 'siliconflow',\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n return siliconflowModels\r\n } catch (error) {\r\n let errorMessage = 'Failed to fetch SiliconFlow models'\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://cloud.siliconflow.cn/i/oJWsm6io'\r\n } else if (errorMessage.includes('permission')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the SiliconFlow API'\r\n } else if (errorMessage.includes('connection')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw error\r\n }\r\n}\r\n\r\nexport async function fetchQwenModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n providerBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n try {\r\n const baseURL =\r\n providerBaseUrl || 'https://dashscope.aliyuncs.com/compatible-mode/v1'\r\n const models = await fetchCustomModels(baseURL, apiKey)\r\n\r\n const qwenModels = models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: 'qwen',\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n return qwenModels\r\n } catch (error) {\r\n let errorMessage = 'Failed to fetch Qwen models'\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://bailian.console.aliyun.com/?tab=model#/api-key'\r\n } else if (errorMessage.includes('permission')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Qwen API'\r\n } else if (errorMessage.includes('connection')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw error\r\n }\r\n}\r\n\r\nexport async function fetchGLMModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n providerBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n try {\r\n const baseURL = providerBaseUrl || 'https://open.bigmodel.cn/api/paas/v4'\r\n const models = await fetchCustomModels(baseURL, apiKey)\r\n\r\n const glmModels = models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: 'glm',\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n return glmModels\r\n } catch (error) {\r\n let errorMessage = 'Failed to fetch GLM models'\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://open.bigmodel.cn (API Keys section)'\r\n } else if (errorMessage.includes('permission')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the GLM API'\r\n } else if (errorMessage.includes('connection')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw error\r\n }\r\n}\r\n\r\nexport async function fetchMinimaxModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n providerBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n try {\r\n const baseURL = providerBaseUrl || 'https://api.minimaxi.com/v1'\r\n const models = await fetchCustomModels(baseURL, apiKey)\r\n\r\n const minimaxModels = models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: 'minimax',\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n return minimaxModels\r\n } catch (error) {\r\n let errorMessage = 'Failed to fetch MiniMax models'\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://www.minimax.io/platform/user-center/basic-information'\r\n } else if (errorMessage.includes('permission')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the MiniMax API'\r\n } else if (errorMessage.includes('connection')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw error\r\n }\r\n}\r\n\r\nexport async function fetchBaiduQianfanModels({\r\n apiKey,\r\n providerBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n providerBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n try {\r\n const baseURL = providerBaseUrl || 'https://qianfan.baidubce.com/v2'\r\n const models = await fetchCustomModels(baseURL, apiKey)\r\n\r\n const baiduModels = models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: 'baidu-qianfan',\r\n max_tokens: model.max_tokens || 8192,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n return baiduModels\r\n } catch (error) {\r\n let errorMessage = 'Failed to fetch Baidu Qianfan models'\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://console.bce.baidu.com/iam/#/iam/accesslist'\r\n } else if (errorMessage.includes('permission')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Baidu Qianfan API'\r\n } else if (errorMessage.includes('connection')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw error\r\n }\r\n}\r\n\r\nexport async function fetchCustomOpenAIModels({\r\n apiKey,\r\n customBaseUrl,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n customBaseUrl: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n try {\r\n const models = await fetchCustomModels(customBaseUrl, apiKey)\r\n\r\n const customModels = models.map((model: any) => ({\r\n model:\r\n model.modelName || model.id || model.name || model.model || 'unknown',\r\n provider: 'custom-openai',\r\n max_tokens: model.max_tokens || 4096,\r\n supports_vision: false,\r\n supports_function_calling: true,\r\n supports_reasoning_effort: false,\r\n }))\r\n\r\n return customModels\r\n } catch (error) {\r\n let errorMessage = 'Failed to fetch custom API models'\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message\r\n }\r\n\r\n if (errorMessage.includes('API key')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Check that your API key is valid for this endpoint'\r\n } else if (errorMessage.includes('endpoint not found')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Make sure the base URL ends with /v1 and supports OpenAI-compatible API'\r\n } else if (errorMessage.includes('connect')) {\r\n errorMessage +=\r\n '\\n\\n\uD83D\uDCA1 Tip: Verify the base URL is correct and accessible'\r\n } else if (errorMessage.includes('response format')) {\r\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: This API may not be fully OpenAI-compatible'\r\n }\r\n\r\n setModelLoadError(errorMessage)\r\n throw error\r\n }\r\n}\r\n\r\nexport async function fetchGeminiModels({\r\n apiKey,\r\n setModelLoadError,\r\n}: {\r\n apiKey: string\r\n setModelLoadError: SetModelLoadError\r\n}): Promise<ModelInfo[]> {\r\n\t try {\r\n\t const response = await fetch(\r\n\t `https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`,\r\n\t )\r\n\r\n\t if (!response.ok) {\r\n\t const errorData = await response.json()\r\n\t throw new Error(\r\n errorData.error?.message || `API error: ${response.status}`,\r\n )\r\n }\r\n\r\n const { models } = await response.json()\r\n\r\n const geminiModels = models\r\n .filter((model: any) =>\r\n model.supportedGenerationMethods.includes('generateContent'),\r\n )\r\n .map((model: any) => ({\r\n model: model.name.replace('models/', ''),\r\n provider: 'gemini',\r\n max_tokens: model.outputTokenLimit,\r\n supports_vision:\r\n model.supportedGenerationMethods.includes('generateContent'),\r\n supports_function_calling:\r\n model.supportedGenerationMethods.includes('generateContent'),\r\n }))\r\n\r\n return geminiModels\r\n } catch (error) {\r\n setModelLoadError(error instanceof Error ? error.message : 'Unknown error')\r\n throw error\r\n }\r\n}\r\n", "import React from 'react'\r\nimport { Box, Text } from 'ink'\r\nimport { Select } from '../custom-select/select'\r\nimport TextInput from '../TextInput'\r\nimport type { ModelInfo } from './types'\r\nimport { buildModelOptions } from './filterModels'\r\n\r\ntype Props = {\r\n theme: any\r\n exitState: { pending: boolean; keyName?: string }\r\n providerLabel: string\r\n modelTypeText: string\r\n\r\n availableModels: ModelInfo[]\r\n modelSearchQuery: string\r\n onModelSearchChange: (value: string) => void\r\n modelSearchCursorOffset: number\r\n onModelSearchCursorOffsetChange: (offset: number) => void\r\n onModelSelect: (model: string) => void\r\n}\r\n\r\nexport function ModelSelectionScreen({\r\n theme,\r\n exitState,\r\n providerLabel,\r\n modelTypeText,\r\n availableModels,\r\n modelSearchQuery,\r\n onModelSearchChange,\r\n modelSearchCursorOffset,\r\n onModelSearchCursorOffsetChange,\r\n onModelSelect,\r\n}: Props): React.ReactNode {\r\n const modelOptions = buildModelOptions(availableModels, modelSearchQuery)\r\n\r\n return (\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Box\r\n flexDirection=\"column\"\r\n gap={1}\r\n borderStyle=\"round\"\r\n borderColor={theme.secondaryBorder}\r\n paddingX={2}\r\n paddingY={1}\r\n >\r\n <Text bold>\r\n Model Selection{' '}\r\n {exitState.pending ? `(press ${exitState.keyName} again to exit)` : ''}\r\n </Text>\r\n <Box flexDirection=\"column\" gap={1}>\r\n <Text bold>\r\n Select a model from {providerLabel} for {modelTypeText}:\r\n </Text>\r\n <Box flexDirection=\"column\" width={70}>\r\n <Text color={theme.secondaryText}>\r\n This model profile can be assigned to different pointers (main,\r\n task, compact, quick) for various use cases.\r\n </Text>\r\n </Box>\r\n\r\n <Box marginY={1}>\r\n <Text bold>Search models:</Text>\r\n <TextInput\r\n placeholder=\"Type to filter models...\"\r\n value={modelSearchQuery}\r\n onChange={onModelSearchChange}\r\n columns={100}\r\n cursorOffset={modelSearchCursorOffset}\r\n onChangeCursorOffset={onModelSearchCursorOffsetChange}\r\n showCursor={true}\r\n focus={true}\r\n />\r\n </Box>\r\n\r\n {modelOptions.length > 0 ? (\r\n <>\r\n <Select\r\n options={modelOptions}\r\n onChange={onModelSelect}\r\n visibleOptionCount={15}\r\n />\r\n <Text dimColor>\r\n Showing {modelOptions.length} of {availableModels.length} models\r\n </Text>\r\n </>\r\n ) : (\r\n <Box>\r\n {availableModels.length > 0 ? (\r\n <Text color=\"yellow\">\r\n No models match your search. Try a different query.\r\n </Text>\r\n ) : (\r\n <Text color=\"yellow\">No models available for this provider.</Text>\r\n )}\r\n </Box>\r\n )}\r\n\r\n <Box marginTop={1}>\r\n <Text dimColor>\r\n Press <Text color={theme.suggestion}>Esc</Text> to go back to API\r\n key input\r\n </Text>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )\r\n}\r\n", "import type { ModelInfo } from './types'\r\n\r\nfunction formatNumber(num: number): string {\r\n if (num >= 1000000) {\r\n return `${(num / 1000000).toFixed(1)}M`\r\n } else if (num >= 1000) {\r\n return `${(num / 1000).toFixed(0)}K`\r\n }\r\n return num.toString()\r\n}\r\n\r\nfunction getModelDetails(model: ModelInfo): string {\r\n const details = []\r\n\r\n if (model.context_length) {\r\n details.push(`${formatNumber(model.context_length)} tokens`)\r\n } else if (model.max_tokens) {\r\n details.push(`${formatNumber(model.max_tokens)} tokens`)\r\n }\r\n\r\n if (model.supports_vision) {\r\n details.push('vision')\r\n }\r\n\r\n if (model.supports_function_calling) {\r\n details.push('tools')\r\n }\r\n\r\n return details.length > 0 ? ` (${details.join(', ')})` : ''\r\n}\r\n\r\nfunction sortModelsByPriority(models: ModelInfo[]): ModelInfo[] {\r\n const priorityKeywords = [\r\n 'claude',\r\n 'kimi',\r\n 'deepseek',\r\n 'minimax',\r\n 'o3',\r\n 'gpt',\r\n 'qwen',\r\n ]\r\n\r\n return models.sort((a, b) => {\r\n const aModelLower = a.model?.toLowerCase() || ''\r\n const bModelLower = b.model?.toLowerCase() || ''\r\n\r\n const aHasPriority = priorityKeywords.some(keyword =>\r\n aModelLower.includes(keyword),\r\n )\r\n const bHasPriority = priorityKeywords.some(keyword =>\r\n bModelLower.includes(keyword),\r\n )\r\n\r\n if (aHasPriority && !bHasPriority) return -1\r\n if (!aHasPriority && bHasPriority) return 1\r\n\r\n return a.model.localeCompare(b.model)\r\n })\r\n}\r\n\r\nexport function buildModelOptions(\r\n availableModels: ModelInfo[],\r\n modelSearchQuery: string,\r\n): Array<{ label: string; value: string }> {\r\n const filteredModels = modelSearchQuery\r\n ? availableModels.filter(model =>\r\n model.model?.toLowerCase().includes(modelSearchQuery.toLowerCase()),\r\n )\r\n : availableModels\r\n\r\n const sortedFilteredModels = sortModelsByPriority(filteredModels)\r\n\r\n return sortedFilteredModels.map(model => ({\r\n label: `${model.model}${getModelDetails(model)}`,\r\n value: model.model,\r\n }))\r\n}\r\n\r\n"],
5
+ "mappings": "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",
6
+ "names": ["resolve", "React", "Text", "line", "nextCursor", "React", "Text", "Box", "Text", "React", "Box", "Text", "React", "isFocused", "isSelected", "React", "Box", "Text", "useState", "useState", "useInput", "React", "Box", "Text", "Box", "Text", "React", "useMemo", "useMemo", "Box", "Text", "code", "type", "line", "useInput", "useState", "useInput", "React", "useState", "Box", "Newline", "Text", "useInput", "React", "Text", "React", "useEffect", "useState", "Box", "Newline", "Text", "useInput", "figures", "React", "Box", "Text", "React", "Box", "Text", "chalk", "useRef", "useInput", "React", "Box", "Text", "React", "Box", "Text", "React", "WindowedOptions", "Text", "Box", "figures", "useState", "useEffect", "resolve", "useInput", "Newline", "useState", "useInput", "React", "Box", "Text", "Newline"]
7
+ }