@shareai-lab/kode 2.1.7 → 2.1.8

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 (167) hide show
  1. package/dist/chunks/{Doctor-3L35GQEA.js → Doctor-EGKBZIML.js} +9 -9
  2. package/dist/chunks/{LogList-JRBIMZK3.js → LogList-GDNOSBDQ.js} +7 -7
  3. package/dist/chunks/{REPL-Z7OH54ZY.js → REPL-6K3HERPA.js} +36 -36
  4. package/dist/chunks/{ResumeConversation-FBJEGMQU.js → ResumeConversation-YHP7BVER.js} +38 -38
  5. package/dist/chunks/{agentLoader-5P4SDNYY.js → agentLoader-DL3TATCS.js} +5 -5
  6. package/dist/chunks/{agentsValidate-MIUUPRQH.js → agentsValidate-CRBB7MRN.js} +6 -6
  7. package/dist/chunks/{ask-OTK6JY6Y.js → ask-VCIR7UL2.js} +16 -16
  8. package/dist/chunks/{autoUpdater-KLQX5DHG.js → autoUpdater-CEH5ETUW.js} +4 -4
  9. package/dist/chunks/{chunk-6GWQEETK.js → chunk-2T4Q7LE2.js} +4 -4
  10. package/dist/chunks/{chunk-YVPUEUBP.js → chunk-37WA4WY2.js} +2 -2
  11. package/dist/chunks/{chunk-S2XSG5L7.js → chunk-3F4IGSES.js} +1 -1
  12. package/dist/chunks/{chunk-HZHMIZGJ.js → chunk-4YSVR4M5.js} +2 -2
  13. package/dist/chunks/{chunk-NCTAWXV7.js → chunk-5PWMLLZZ.js} +1 -1
  14. package/dist/chunks/{chunk-C7NZLWIA.js → chunk-7FUCXSBS.js} +1 -1
  15. package/dist/chunks/{chunk-5CWBMOLZ.js → chunk-7NNQSSSB.js} +4 -4
  16. package/dist/chunks/{chunk-UOCIKFUW.js → chunk-AJQ2UPE4.js} +4 -4
  17. package/dist/chunks/{chunk-T3SKZPKI.js → chunk-AQTMF2G6.js} +3 -3
  18. package/dist/chunks/{chunk-K5RJXSIY.js → chunk-BIUJ2KCG.js} +3 -3
  19. package/dist/chunks/{chunk-JZ6TDDXP.js → chunk-BUPSIQAQ.js} +1 -1
  20. package/dist/chunks/{chunk-3C435W3Q.js → chunk-D34CKHL4.js} +19 -19
  21. package/dist/chunks/{chunk-7XYEUUGY.js → chunk-DIBHCLFW.js} +1 -1
  22. package/dist/chunks/{chunk-L3G2KW3R.js → chunk-EGWOQ5JS.js} +3 -3
  23. package/dist/chunks/{chunk-VLC7N6VV.js → chunk-EWJ6VEH6.js} +1 -1
  24. package/dist/chunks/{chunk-Q5UM4EKB.js → chunk-FRYYGI6N.js} +1 -1
  25. package/dist/chunks/{chunk-QPVADKH4.js → chunk-HQWE3TGT.js} +2 -2
  26. package/dist/chunks/{chunk-2ZW3X7UO.js → chunk-HTIDBTYD.js} +7 -7
  27. package/dist/chunks/{chunk-P7DGVS3A.js → chunk-IRECSUZZ.js} +34 -32
  28. package/dist/chunks/chunk-IRECSUZZ.js.map +7 -0
  29. package/dist/chunks/{chunk-MIIJHURF.js → chunk-JFO7DT2K.js} +1 -1
  30. package/dist/chunks/{chunk-AIFYUWAJ.js → chunk-K2CWFG3O.js} +1 -1
  31. package/dist/chunks/{chunk-OHI43FZV.js → chunk-KBU26G53.js} +29 -29
  32. package/dist/chunks/{chunk-OHI43FZV.js.map → chunk-KBU26G53.js.map} +2 -2
  33. package/dist/chunks/{chunk-GAENNHAB.js → chunk-KD5LMP2A.js} +2 -2
  34. package/dist/chunks/{chunk-X3FNDZH3.js → chunk-LXPPZ433.js} +1 -1
  35. package/dist/chunks/{chunk-QMZROKLT.js → chunk-MKGO2NMQ.js} +2 -2
  36. package/dist/chunks/{chunk-IIU3EEO6.js → chunk-MN6E4VHJ.js} +1 -1
  37. package/dist/chunks/{chunk-NVIIGNRI.js → chunk-NJOTGF2H.js} +1 -1
  38. package/dist/chunks/{chunk-PHBGBKGF.js → chunk-NY3SPCJN.js} +1 -1
  39. package/dist/chunks/{chunk-2KPPALZS.js → chunk-OIZNJRB4.js} +12 -10
  40. package/dist/chunks/chunk-OIZNJRB4.js.map +7 -0
  41. package/dist/chunks/{chunk-NQXQWWU7.js → chunk-P22FIYOC.js} +5 -5
  42. package/dist/chunks/{chunk-MN7PCCBR.js → chunk-QIEQRWMR.js} +2 -2
  43. package/dist/chunks/{chunk-DEQKKV43.js → chunk-R3EPQ7RK.js} +2 -2
  44. package/dist/chunks/{chunk-I3BXG3L6.js → chunk-SI7L5UCG.js} +2 -2
  45. package/dist/chunks/{chunk-L2KQYYWQ.js → chunk-STFQ32ME.js} +10 -10
  46. package/dist/chunks/{chunk-NJQA5TMT.js → chunk-T6QB2CGD.js} +2 -2
  47. package/dist/chunks/{chunk-JQ4UWMEI.js → chunk-TE2DS54K.js} +3 -3
  48. package/dist/chunks/{chunk-RENQ7FKI.js → chunk-UT5S3MDX.js} +5 -5
  49. package/dist/chunks/{chunk-5X2WIGMG.js → chunk-XK73FTJT.js} +1 -1
  50. package/dist/chunks/{chunk-5X2WIGMG.js.map → chunk-XK73FTJT.js.map} +1 -1
  51. package/dist/chunks/{chunk-2UAFIDOG.js → chunk-XZLHIUJA.js} +2 -2
  52. package/dist/chunks/{chunk-STJ7IA4I.js → chunk-ZIW3FRN5.js} +4 -4
  53. package/dist/chunks/{client-CQTZ2TDK.js → client-GA7TIEHM.js} +5 -5
  54. package/dist/chunks/{customCommands-JX4IHR6N.js → customCommands-ZKVONPFU.js} +5 -5
  55. package/dist/chunks/{engine-5XVTLRCC.js → engine-Q3PEQEX6.js} +15 -15
  56. package/dist/chunks/{env-AC3HPJYK.js → env-BT27KPZA.js} +3 -3
  57. package/dist/chunks/{kodeAgentSessionLoad-OCDNJBDW.js → kodeAgentSessionLoad-HV2N3LBW.js} +3 -3
  58. package/dist/chunks/{kodeAgentSessionResume-MX2JYZWS.js → kodeAgentSessionResume-23AXP5CM.js} +3 -3
  59. package/dist/chunks/{kodeHooks-FG4H3PCA.js → kodeHooks-VJ3AO5R3.js} +4 -4
  60. package/dist/chunks/{llm-LWWXFYJV.js → llm-5CEO3S3M.js} +13 -13
  61. package/dist/chunks/{llmLazy-57BHTMWO.js → llmLazy-W7ZM4DSR.js} +1 -1
  62. package/dist/chunks/{mcpCli-ACYQDE2P.js → mcpCli-RW5XGGTL.js} +5 -5
  63. package/dist/chunks/{mentionProcessor-WGFUC4CO.js → mentionProcessor-PEDB5MT3.js} +6 -6
  64. package/dist/chunks/{model-C6XJELK3.js → model-AAFSAVXQ.js} +5 -5
  65. package/dist/chunks/{openai-YPCUNJV6.js → openai-JYNI7IAS.js} +5 -5
  66. package/dist/chunks/{permissions-R7ISL4FQ.js → permissions-HOZM2H7J.js} +6 -6
  67. package/dist/chunks/{pluginRuntime-O5S4YTHA.js → pluginRuntime-DHJU5L6L.js} +3 -3
  68. package/dist/chunks/{pluginValidation-UO7G2L6E.js → pluginValidation-4BT6JQYH.js} +7 -7
  69. package/dist/chunks/{registry-H6Z7RGKW.js → registry-NILWZGYM.js} +29 -29
  70. package/dist/chunks/{ripgrep-ZQQGUPQG.js → ripgrep-U7RJNDR2.js} +4 -4
  71. package/dist/chunks/{runNonTextPrintMode-3C22ZQVQ.js → runNonTextPrintMode-JZ4OJJHG.js} +9 -9
  72. package/dist/chunks/{server-4XRF6KBY.js → server-ME5EMD43.js} +25 -25
  73. package/dist/chunks/{server-JEVQGAGS.js → server-YAYUUCYM.js} +27 -27
  74. package/dist/chunks/{skillMarketplace-DY2BV5DL.js → skillMarketplace-RIL7L56S.js} +4 -4
  75. package/dist/chunks/{src-KGXLCQ5T.js → src-7GM23W7O.js} +70 -70
  76. package/dist/chunks/{src-CE25ME6Y.js → src-GW44D7T3.js} +27 -27
  77. package/dist/chunks/{src-WIIICKMW.js → src-QBZN7LKA.js} +24 -24
  78. package/dist/chunks/{thinking-4KNMONEN.js → thinking-37PAW3YD.js} +6 -6
  79. package/dist/chunks/{toolPermissionSettings-EX3GBT7L.js → toolPermissionSettings-QACTQRWS.js} +4 -4
  80. package/dist/chunks/{webOnlyMode-RKACEWYY.js → webOnlyMode-2HLMSPA2.js} +1 -1
  81. package/dist/entrypoints/cli.js +1 -1
  82. package/dist/entrypoints/daemon.js +1 -1
  83. package/dist/entrypoints/mcp.js +25 -25
  84. package/dist/index.js +5 -5
  85. package/dist/sdk/core.cjs +1 -1
  86. package/dist/sdk/core.cjs.map +1 -1
  87. package/dist/sdk/core.js +1 -1
  88. package/dist/sdk/core.js.map +1 -1
  89. package/dist/sdk/tools.cjs +8 -4
  90. package/dist/sdk/tools.cjs.map +2 -2
  91. package/dist/sdk/tools.js +8 -4
  92. package/dist/sdk/tools.js.map +2 -2
  93. package/package.json +1 -1
  94. package/dist/chunks/chunk-2KPPALZS.js.map +0 -7
  95. package/dist/chunks/chunk-P7DGVS3A.js.map +0 -7
  96. /package/dist/chunks/{Doctor-3L35GQEA.js.map → Doctor-EGKBZIML.js.map} +0 -0
  97. /package/dist/chunks/{LogList-JRBIMZK3.js.map → LogList-GDNOSBDQ.js.map} +0 -0
  98. /package/dist/chunks/{REPL-Z7OH54ZY.js.map → REPL-6K3HERPA.js.map} +0 -0
  99. /package/dist/chunks/{ResumeConversation-FBJEGMQU.js.map → ResumeConversation-YHP7BVER.js.map} +0 -0
  100. /package/dist/chunks/{agentLoader-5P4SDNYY.js.map → agentLoader-DL3TATCS.js.map} +0 -0
  101. /package/dist/chunks/{agentsValidate-MIUUPRQH.js.map → agentsValidate-CRBB7MRN.js.map} +0 -0
  102. /package/dist/chunks/{ask-OTK6JY6Y.js.map → ask-VCIR7UL2.js.map} +0 -0
  103. /package/dist/chunks/{autoUpdater-KLQX5DHG.js.map → autoUpdater-CEH5ETUW.js.map} +0 -0
  104. /package/dist/chunks/{chunk-6GWQEETK.js.map → chunk-2T4Q7LE2.js.map} +0 -0
  105. /package/dist/chunks/{chunk-YVPUEUBP.js.map → chunk-37WA4WY2.js.map} +0 -0
  106. /package/dist/chunks/{chunk-S2XSG5L7.js.map → chunk-3F4IGSES.js.map} +0 -0
  107. /package/dist/chunks/{chunk-HZHMIZGJ.js.map → chunk-4YSVR4M5.js.map} +0 -0
  108. /package/dist/chunks/{chunk-NCTAWXV7.js.map → chunk-5PWMLLZZ.js.map} +0 -0
  109. /package/dist/chunks/{chunk-C7NZLWIA.js.map → chunk-7FUCXSBS.js.map} +0 -0
  110. /package/dist/chunks/{chunk-5CWBMOLZ.js.map → chunk-7NNQSSSB.js.map} +0 -0
  111. /package/dist/chunks/{chunk-UOCIKFUW.js.map → chunk-AJQ2UPE4.js.map} +0 -0
  112. /package/dist/chunks/{chunk-T3SKZPKI.js.map → chunk-AQTMF2G6.js.map} +0 -0
  113. /package/dist/chunks/{chunk-K5RJXSIY.js.map → chunk-BIUJ2KCG.js.map} +0 -0
  114. /package/dist/chunks/{chunk-JZ6TDDXP.js.map → chunk-BUPSIQAQ.js.map} +0 -0
  115. /package/dist/chunks/{chunk-3C435W3Q.js.map → chunk-D34CKHL4.js.map} +0 -0
  116. /package/dist/chunks/{chunk-7XYEUUGY.js.map → chunk-DIBHCLFW.js.map} +0 -0
  117. /package/dist/chunks/{chunk-L3G2KW3R.js.map → chunk-EGWOQ5JS.js.map} +0 -0
  118. /package/dist/chunks/{chunk-VLC7N6VV.js.map → chunk-EWJ6VEH6.js.map} +0 -0
  119. /package/dist/chunks/{chunk-Q5UM4EKB.js.map → chunk-FRYYGI6N.js.map} +0 -0
  120. /package/dist/chunks/{chunk-QPVADKH4.js.map → chunk-HQWE3TGT.js.map} +0 -0
  121. /package/dist/chunks/{chunk-2ZW3X7UO.js.map → chunk-HTIDBTYD.js.map} +0 -0
  122. /package/dist/chunks/{chunk-MIIJHURF.js.map → chunk-JFO7DT2K.js.map} +0 -0
  123. /package/dist/chunks/{chunk-AIFYUWAJ.js.map → chunk-K2CWFG3O.js.map} +0 -0
  124. /package/dist/chunks/{chunk-GAENNHAB.js.map → chunk-KD5LMP2A.js.map} +0 -0
  125. /package/dist/chunks/{chunk-X3FNDZH3.js.map → chunk-LXPPZ433.js.map} +0 -0
  126. /package/dist/chunks/{chunk-QMZROKLT.js.map → chunk-MKGO2NMQ.js.map} +0 -0
  127. /package/dist/chunks/{chunk-IIU3EEO6.js.map → chunk-MN6E4VHJ.js.map} +0 -0
  128. /package/dist/chunks/{chunk-NVIIGNRI.js.map → chunk-NJOTGF2H.js.map} +0 -0
  129. /package/dist/chunks/{chunk-PHBGBKGF.js.map → chunk-NY3SPCJN.js.map} +0 -0
  130. /package/dist/chunks/{chunk-NQXQWWU7.js.map → chunk-P22FIYOC.js.map} +0 -0
  131. /package/dist/chunks/{chunk-MN7PCCBR.js.map → chunk-QIEQRWMR.js.map} +0 -0
  132. /package/dist/chunks/{chunk-DEQKKV43.js.map → chunk-R3EPQ7RK.js.map} +0 -0
  133. /package/dist/chunks/{chunk-I3BXG3L6.js.map → chunk-SI7L5UCG.js.map} +0 -0
  134. /package/dist/chunks/{chunk-L2KQYYWQ.js.map → chunk-STFQ32ME.js.map} +0 -0
  135. /package/dist/chunks/{chunk-NJQA5TMT.js.map → chunk-T6QB2CGD.js.map} +0 -0
  136. /package/dist/chunks/{chunk-JQ4UWMEI.js.map → chunk-TE2DS54K.js.map} +0 -0
  137. /package/dist/chunks/{chunk-RENQ7FKI.js.map → chunk-UT5S3MDX.js.map} +0 -0
  138. /package/dist/chunks/{chunk-2UAFIDOG.js.map → chunk-XZLHIUJA.js.map} +0 -0
  139. /package/dist/chunks/{chunk-STJ7IA4I.js.map → chunk-ZIW3FRN5.js.map} +0 -0
  140. /package/dist/chunks/{client-CQTZ2TDK.js.map → client-GA7TIEHM.js.map} +0 -0
  141. /package/dist/chunks/{customCommands-JX4IHR6N.js.map → customCommands-ZKVONPFU.js.map} +0 -0
  142. /package/dist/chunks/{engine-5XVTLRCC.js.map → engine-Q3PEQEX6.js.map} +0 -0
  143. /package/dist/chunks/{env-AC3HPJYK.js.map → env-BT27KPZA.js.map} +0 -0
  144. /package/dist/chunks/{kodeAgentSessionLoad-OCDNJBDW.js.map → kodeAgentSessionLoad-HV2N3LBW.js.map} +0 -0
  145. /package/dist/chunks/{kodeAgentSessionResume-MX2JYZWS.js.map → kodeAgentSessionResume-23AXP5CM.js.map} +0 -0
  146. /package/dist/chunks/{kodeHooks-FG4H3PCA.js.map → kodeHooks-VJ3AO5R3.js.map} +0 -0
  147. /package/dist/chunks/{llm-LWWXFYJV.js.map → llm-5CEO3S3M.js.map} +0 -0
  148. /package/dist/chunks/{llmLazy-57BHTMWO.js.map → llmLazy-W7ZM4DSR.js.map} +0 -0
  149. /package/dist/chunks/{mcpCli-ACYQDE2P.js.map → mcpCli-RW5XGGTL.js.map} +0 -0
  150. /package/dist/chunks/{mentionProcessor-WGFUC4CO.js.map → mentionProcessor-PEDB5MT3.js.map} +0 -0
  151. /package/dist/chunks/{model-C6XJELK3.js.map → model-AAFSAVXQ.js.map} +0 -0
  152. /package/dist/chunks/{openai-YPCUNJV6.js.map → openai-JYNI7IAS.js.map} +0 -0
  153. /package/dist/chunks/{permissions-R7ISL4FQ.js.map → permissions-HOZM2H7J.js.map} +0 -0
  154. /package/dist/chunks/{pluginRuntime-O5S4YTHA.js.map → pluginRuntime-DHJU5L6L.js.map} +0 -0
  155. /package/dist/chunks/{pluginValidation-UO7G2L6E.js.map → pluginValidation-4BT6JQYH.js.map} +0 -0
  156. /package/dist/chunks/{registry-H6Z7RGKW.js.map → registry-NILWZGYM.js.map} +0 -0
  157. /package/dist/chunks/{ripgrep-ZQQGUPQG.js.map → ripgrep-U7RJNDR2.js.map} +0 -0
  158. /package/dist/chunks/{runNonTextPrintMode-3C22ZQVQ.js.map → runNonTextPrintMode-JZ4OJJHG.js.map} +0 -0
  159. /package/dist/chunks/{server-4XRF6KBY.js.map → server-ME5EMD43.js.map} +0 -0
  160. /package/dist/chunks/{server-JEVQGAGS.js.map → server-YAYUUCYM.js.map} +0 -0
  161. /package/dist/chunks/{skillMarketplace-DY2BV5DL.js.map → skillMarketplace-RIL7L56S.js.map} +0 -0
  162. /package/dist/chunks/{src-KGXLCQ5T.js.map → src-7GM23W7O.js.map} +0 -0
  163. /package/dist/chunks/{src-CE25ME6Y.js.map → src-GW44D7T3.js.map} +0 -0
  164. /package/dist/chunks/{src-WIIICKMW.js.map → src-QBZN7LKA.js.map} +0 -0
  165. /package/dist/chunks/{thinking-4KNMONEN.js.map → thinking-37PAW3YD.js.map} +0 -0
  166. /package/dist/chunks/{toolPermissionSettings-EX3GBT7L.js.map → toolPermissionSettings-QACTQRWS.js.map} +0 -0
  167. /package/dist/chunks/{webOnlyMode-RKACEWYY.js.map → webOnlyMode-2HLMSPA2.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../apps/cli/src/ui/components/TextInput.tsx", "../../apps/cli/src/ui/hooks/useTextInput.ts", "../../apps/cli/src/utils/Cursor/MeasuredText.ts", "../../apps/cli/src/utils/Cursor.ts", "../../apps/cli/src/ui/hooks/useTextInputMapping.ts", "../../packages/core/src/utils/imagePaste.ts", "../../apps/cli/src/ui/hooks/useTextInputTryImagePaste.ts", "../../apps/cli/src/ui/components/TextInputBracketedPaste.ts", "../../apps/cli/src/ui/utils/inkInstanceStore.ts", "../../apps/cli/src/ui/components/CustomSelect/select.tsx", "../../apps/cli/src/ui/components/CustomSelect/select-option.tsx", "../../apps/cli/src/ui/components/CustomSelect/use-select-state.ts", "../../apps/cli/src/ui/components/CustomSelect/option-map.ts", "../../apps/cli/src/ui/components/CustomSelect/select-state.ts", "../../apps/cli/src/ui/components/CustomSelect/use-select.ts", "../../apps/cli/src/ui/screens/setup/OnboardingScreen.tsx", "../../apps/cli/src/ui/components/StructuredDiff.tsx", "../../apps/cli/src/ui/components/ModelSelector/ModelSelector.tsx", "../../apps/cli/src/ui/components/ModelSelector/ModelSelectorView.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ApiKeyScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/BaseUrlScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ConfirmationScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/options.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ConnectionTestScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ContextLengthScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ModelInputScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ModelParamsScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ModelSelectionScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/PartnerCodingPlansScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/PartnerProvidersScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ProviderSelectionScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/screens/ResourceNameScreen.tsx", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorController.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/printModelConfig.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorInput.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorMenus.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorModelOptions.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorState.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/state.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/connectionTest/openAICompatibility.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/connectionTest/testChatEndpoint.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/connectionTest/testAnthropicMessagesEndpoint.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/connectionTest/testProviderSpecificEndpoint.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/connectionTest/performConnectionTest.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/connectionTest/runConnectionTestFlow.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/providerSelection.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/saveConfiguration.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/actions/fetchModels.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/anthropic.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/baiduQianfan.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/customOpenAI.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/deepseek.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/gemini.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/glm.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/kimi.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/minimax.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/qwen.ts", "../../apps/cli/src/ui/components/ModelSelector/flow/modelFetchers/siliconflow.ts", "../../apps/cli/src/ui/components/ModelSelector/fetchOllamaModels.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorModelFlow.tsx", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorTextHandlers.ts", "../../apps/cli/src/ui/components/ModelSelector/useModelSelectorActions.tsx", "../../apps/cli/src/ui/components/ModelSelector/flow/useEscapeNavigation.ts"],
4
+ "sourcesContent": ["import React from 'react'\nimport { Text } from 'ink'\nimport chalk from 'chalk'\nimport { useTextInput } from '#ui-ink/hooks/useTextInput'\nimport { getTheme } from '#core/utils/theme'\nimport { type Key, useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { shouldAggregatePasteChunk } from '#core/utils/paste'\nimport { terminalCapabilityManager } from '#ui-ink/utils/terminalCapabilityManager'\nimport { useBracketedPasteSequences } from './TextInputBracketedPaste'\nimport type { Props } from './TextInput.types'\nexport type { Props } from './TextInput.types'\n\nexport default function TextInput({\n value: originalValue,\n placeholder = '',\n focus = true,\n mask,\n displayValue,\n multiline = false,\n highlightPastedText = false,\n showCursor = true,\n onChange,\n onSubmit,\n onExit,\n onHistoryUp,\n onHistoryDown,\n onExitMessage,\n onMessage,\n onHistoryReset,\n columns,\n maxHeight,\n onImagePaste,\n onPaste,\n isDimmed = false,\n disableCursorMovementForUpDownKeys = false,\n onSpecialKey,\n cursorOffset,\n onChangeCursorOffset,\n}: Props) {\n const { onInput, renderedValue } = useTextInput({\n value: originalValue,\n onChange,\n onSubmit,\n onExit,\n onExitMessage,\n onMessage,\n onHistoryReset,\n onHistoryUp,\n onHistoryDown,\n focus,\n mask,\n multiline,\n cursorChar: showCursor ? ' ' : '',\n highlightPastedText,\n invert: chalk.inverse,\n themeText: (text: string) => chalk.hex(getTheme().text)(text),\n columns,\n maxHeight,\n onImagePaste,\n disableCursorMovementForUpDownKeys,\n externalOffset: cursorOffset,\n onOffsetChange: onChangeCursorOffset,\n })\n\n // Paste detection state\n const [pasteState, setPasteState] = React.useState<{\n chunks: string[]\n timeoutId: ReturnType<typeof setTimeout> | null\n }>({ chunks: [], timeoutId: null })\n const pasteGuardUntilRef = React.useRef<number>(0)\n const pasteWarningTimeoutRef = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null)\n const onMessageRef = React.useRef<Props['onMessage']>(onMessage)\n\n React.useEffect(() => {\n onMessageRef.current = onMessage\n }, [onMessage])\n\n const isPasteTrusted = React.useCallback(() => {\n return (\n terminalCapabilityManager.isBracketedPasteEnabled() ||\n terminalCapabilityManager.isKittyProtocolEnabled()\n )\n }, [])\n\n const clearPasteWarning = React.useCallback(() => {\n if (pasteWarningTimeoutRef.current) {\n clearTimeout(pasteWarningTimeoutRef.current)\n pasteWarningTimeoutRef.current = null\n }\n onMessageRef.current?.(false)\n }, [])\n\n const showPasteWarning = React.useCallback(() => {\n const onMessage = onMessageRef.current\n if (!onMessage) return\n onMessage(\n true,\n 'Paste protection unavailable. Press Enter again to submit.',\n )\n if (pasteWarningTimeoutRef.current) {\n clearTimeout(pasteWarningTimeoutRef.current)\n }\n pasteWarningTimeoutRef.current = setTimeout(() => {\n onMessageRef.current?.(false)\n pasteWarningTimeoutRef.current = null\n }, 1000)\n }, [])\n\n const armPasteGuard = React.useCallback(() => {\n if (isPasteTrusted()) return\n pasteGuardUntilRef.current = Date.now() + 40\n }, [isPasteTrusted])\n\n const shouldBlockEnter = React.useCallback(\n (key: Key): boolean => {\n if (!key.return || key.shift || key.meta) return false\n if (isPasteTrusted()) return false\n if (!pasteGuardUntilRef.current) return false\n if (Date.now() >= pasteGuardUntilRef.current) return false\n pasteGuardUntilRef.current = 0\n showPasteWarning()\n return true\n },\n [isPasteTrusted, showPasteWarning],\n )\n\n React.useEffect(\n () => () => {\n clearPasteWarning()\n },\n [clearPasteWarning],\n )\n\n const handleBracketedPasteSequences = useBracketedPasteSequences({\n insertText: (text: string) => onInput(text, {} as Key),\n onPaste,\n })\n\n const resetPasteTimeout = (\n currentTimeoutId: ReturnType<typeof setTimeout> | null,\n ) => {\n if (currentTimeoutId) {\n clearTimeout(currentTimeoutId)\n }\n return setTimeout(() => {\n setPasteState(({ chunks }) => {\n const pastedText = chunks.join('')\n // Schedule callback after current render to avoid state updates during render\n Promise.resolve().then(() => onPaste!(pastedText))\n return { chunks: [], timeoutId: null }\n })\n }, 500)\n }\n\n const wrappedOnInput = (input: string, key: Key): void => {\n // Some terminals (e.g. kitty/wezterm with CSI-u keyboard protocol) encode Enter with modifiers as CSI u sequences.\n // Example: ESC[13;3u (Alt/Option+Enter). Ink may strip the leading ESC.\n if (/^(?:\\x1b)?\\[13;2(?:u|~)$/.test(input)) {\n // Shift+Enter -> newline in multiline chat inputs.\n const nextKey = {\n ...key,\n return: true,\n meta: false,\n shift: true,\n } as Key\n if (shouldBlockEnter(nextKey)) return\n onInput('\\r', nextKey)\n return\n }\n if (/^(?:\\x1b)?\\[13;(?:3|4)(?:u|~)$/.test(input)) {\n // Alt/Option+Enter (or Shift+Alt/Option+Enter) -> newline in multiline chat inputs.\n const nextKey = { ...key, return: true, meta: true } as Key\n if (shouldBlockEnter(nextKey)) return\n onInput('\\r', nextKey)\n return\n }\n\n // Some terminals/keybindings emit LF (\"\\n\") for modified Enter. In multiline inputs, insert a newline.\n // In single-line inputs, treat it as Enter for compatibility.\n if (input === '\\n') {\n if (multiline) {\n if (shouldBlockEnter({ ...key, return: true } as Key)) return\n onInput('\\n', key)\n return\n }\n\n const nextKey = { ...key, return: true } as Key\n if (shouldBlockEnter(nextKey)) return\n onInput('\\r', nextKey)\n return\n }\n\n // Some terminals/keybindings emit ESC+CR/LF for Option+Enter. Depending on the decoder,\n // it may arrive as a raw 2-char sequence; treat it as Meta+Enter for multiline inputs.\n if (input === '\\x1b\\r' || input === '\\x1b\\n') {\n const nextKey = {\n ...key,\n return: true,\n meta: true,\n } as Key\n if (shouldBlockEnter(nextKey)) return\n onInput('\\r', nextKey)\n return\n }\n\n // Check for special key combinations first\n if (onSpecialKey && onSpecialKey(input, key)) {\n // Special key was handled, don't process further\n return\n }\n\n // Special handling for backspace or delete\n if (\n key.backspace ||\n key.delete ||\n input === '\\b' ||\n input === '\\x7f' ||\n input === '\\x08'\n ) {\n // Ensure backspace is handled directly\n onInput(input, {\n ...key,\n backspace: true,\n })\n return\n }\n\n // Bracketed paste mode: consume sequences and emit either special paste callback or normal insertion\n if (input && handleBracketedPasteSequences(input)) {\n armPasteGuard()\n return\n }\n\n // Handle pastes (>800 chars)\n // Usually we get one or two input characters at a time. If we\n // get a bunch, the user has probably pasted.\n // Unfortunately node batches long pastes, so it's possible\n // that we would see e.g. 1024 characters and then just a few\n // more in the next frame that belong with the original paste.\n // This batching number is not consistent.\n if (\n onPaste &&\n shouldAggregatePasteChunk(input, pasteState.timeoutId !== null)\n ) {\n armPasteGuard()\n setPasteState(({ chunks, timeoutId }) => {\n return {\n chunks: [...chunks, input],\n timeoutId: resetPasteTimeout(timeoutId),\n }\n })\n return\n }\n\n if (shouldBlockEnter(key)) return\n onInput(input, key)\n }\n\n useKeypress(wrappedOnInput, { isActive: focus, priority: -10 })\n\n let renderedPlaceholder = placeholder\n ? chalk.hex(getTheme().secondaryText)(placeholder)\n : undefined\n\n // Fake mouse cursor, because we like punishment\n if (showCursor && focus) {\n renderedPlaceholder =\n placeholder.length > 0\n ? chalk.inverse(placeholder[0]) +\n chalk.hex(getTheme().secondaryText)(placeholder.slice(1))\n : chalk.inverse(' ')\n }\n\n const showPlaceholder = originalValue.length == 0 && placeholder\n const renderOverride =\n !showPlaceholder && typeof displayValue === 'string' ? displayValue : null\n\n const renderedOverrideValue =\n renderOverride && showCursor && focus\n ? renderOverride + chalk.inverse(' ')\n : renderOverride\n\n return (\n <Text wrap=\"truncate-end\" dimColor={isDimmed}>\n {showPlaceholder\n ? renderedPlaceholder\n : (renderedOverrideValue ?? renderedValue)}\n </Text>\n )\n}\n", "import { useRef, useState } from 'react'\nimport { type Key } from '#ui-ink/hooks/useKeypress'\nimport { useDoublePress } from './useDoublePress'\nimport { Cursor } from '#cli-utils/Cursor'\nimport { normalizeLineEndings } from '#core/utils/paste'\nimport type {\n UseTextInputProps,\n UseTextInputResult,\n} from './useTextInput.types'\nimport { mapInput } from './useTextInputMapping'\nimport { tryImagePaste } from './useTextInputTryImagePaste'\n\ntype MaybeCursor = void | Cursor\n\n// IME (especially CJK) can emit cursor-navigation-like sequences around commits.\n// A slightly longer guard helps prevent cursor jumps / wrong insertion points.\nconst IME_NAVIGATION_GUARD_MS = 150\nconst IME_ENTER_GUARD_MS = 150\n\nexport function useTextInput({\n value: originalValue,\n onChange,\n onSubmit,\n onExit,\n onExitMessage,\n onMessage,\n onHistoryUp,\n onHistoryDown,\n onHistoryReset,\n mask = '',\n multiline = false,\n cursorChar,\n invert,\n columns,\n maxHeight,\n onImagePaste,\n disableCursorMovementForUpDownKeys = false,\n externalOffset,\n onOffsetChange,\n}: UseTextInputProps): UseTextInputResult {\n const offset = externalOffset\n const setOffset = onOffsetChange\n const cursorRef = useRef(Cursor.fromText(originalValue, columns, offset))\n const lastComplexInsertRef = useRef(0)\n const lastNonAsciiInsertRef = useRef(0)\n const [imagePasteErrorTimeout, setImagePasteErrorTimeout] =\n useState<NodeJS.Timeout | null>(null)\n\n // Keep the cursor model in sync with external value/offset/columns updates.\n // Important: avoid recomputing wrapped layout unless the text or column count changed.\n const safeColumns = Math.max(1, columns - 1)\n const currentCursor = cursorRef.current\n if (\n currentCursor.measuredText.text !== originalValue ||\n currentCursor.measuredText.columns !== safeColumns\n ) {\n cursorRef.current = Cursor.fromText(originalValue, columns, offset)\n } else if (currentCursor.offset !== offset) {\n cursorRef.current = new Cursor(currentCursor.measuredText, offset)\n }\n\n function maybeClearImagePasteErrorTimeout() {\n if (!imagePasteErrorTimeout) {\n return\n }\n clearTimeout(imagePasteErrorTimeout)\n setImagePasteErrorTimeout(null)\n onMessage?.(false)\n }\n\n function applyCursor(nextCursor: Cursor) {\n const previousCursor = cursorRef.current\n if (previousCursor.equals(nextCursor)) {\n return\n }\n cursorRef.current = nextCursor\n setOffset(nextCursor.offset)\n if (previousCursor.text !== nextCursor.text) {\n onChange(nextCursor.text)\n }\n }\n\n const handleCtrlC = useDoublePress(\n show => {\n maybeClearImagePasteErrorTimeout()\n onExitMessage?.(show, 'Ctrl-C')\n },\n () => onExit?.(),\n () => {\n if (originalValue) {\n onChange('')\n onHistoryReset?.()\n }\n },\n )\n\n // Keep Escape for clearing input\n const handleEscape = useDoublePress(\n show => {\n maybeClearImagePasteErrorTimeout()\n onMessage?.(!!originalValue && show, `Press Escape again to clear`)\n },\n () => {\n if (originalValue) {\n onChange('')\n }\n },\n )\n function clear() {\n return Cursor.fromText('', columns, 0)\n }\n\n const handleEmptyCtrlD = useDoublePress(\n show => onExitMessage?.(show, 'Ctrl-D'),\n () => onExit?.(),\n )\n\n function handleCtrlD(): MaybeCursor {\n maybeClearImagePasteErrorTimeout()\n const currentCursor = cursorRef.current\n if (currentCursor.text === '') {\n // When input is empty, handle double-press\n handleEmptyCtrlD()\n return currentCursor\n }\n // When input is not empty, delete forward like iPython\n return currentCursor.del()\n }\n\n function handleImagePaste() {\n return tryImagePaste({\n cursor: cursorRef.current,\n mask,\n onImagePaste,\n onMessage,\n setImagePasteErrorTimeout,\n clearImagePasteErrorTimeout: maybeClearImagePasteErrorTimeout,\n })\n }\n\n function getCursor(): Cursor {\n return cursorRef.current\n }\n\n function shouldSuppressNavigation(): boolean {\n const last = lastComplexInsertRef.current\n return last > 0 && Date.now() - last < IME_NAVIGATION_GUARD_MS\n }\n\n const handleCtrl = mapInput<MaybeCursor>(\n [\n ['a', () => getCursor().startOfLine()],\n ['b', () => getCursor().left()],\n ['c', handleCtrlC],\n ['d', handleCtrlD],\n ['e', () => getCursor().endOfLine()],\n ['f', () => getCursor().right()],\n [\n 'h',\n () => {\n maybeClearImagePasteErrorTimeout()\n return getCursor().backspace()\n },\n ],\n // Cross-terminal multiline fallback (Ctrl+J is LF on many systems).\n ['j', () => (multiline ? getCursor().insert('\\n') : undefined)],\n ['k', () => getCursor().deleteToLineEnd()],\n ['l', () => clear()],\n ['n', () => downOrHistoryDown()],\n ['p', () => upOrHistoryUp()],\n ['u', () => getCursor().deleteToLineStart()],\n ['v', handleImagePaste],\n ['w', () => getCursor().deleteWordBefore()],\n ],\n () => undefined,\n )\n\n const handleMeta = mapInput<MaybeCursor>(\n [\n ['b', () => getCursor().prevWord()],\n ['f', () => getCursor().nextWord()],\n ['d', () => getCursor().deleteWordAfter()],\n ],\n () => undefined,\n )\n\n function handleEnter(key: Key) {\n if (!multiline) {\n onSubmit?.(originalValue)\n return\n }\n\n // Multiline chat input: Enter submits, Shift+Enter and Option/Alt+Enter insert newline.\n const optionPressed = (() => {\n if (!('option' in key)) return false\n const optionValue = (key as unknown as Record<string, unknown>).option\n return optionValue === true\n })()\n const sequence = typeof key.sequence === 'string' ? key.sequence : ''\n const modifierEnterSequence =\n // kitty/CSI-u: ESC[13;2u (shift) / ESC[13;3u (alt) / ESC[13;4u (shift+alt)\n /^\\x1b\\[13;[234](?:u|~)$/.test(sequence) ||\n // modifyOtherKeys: CSI 27 ; modifier ; 13 ~\n /^\\x1b\\[27;[234];13~$/.test(sequence) ||\n // Some terminals encode Shift+Enter as CSI 13 $\n /^\\x1b\\[13\\$$/.test(sequence) ||\n // Alt/Option+Enter may arrive as ESC-prefixed CR/LF\n sequence === '\\x1b\\r' ||\n sequence === '\\x1b\\n' ||\n // Windows Terminal: Ctrl+Enter (CSI 13;5u)\n /^\\x1b\\[13;5u$/.test(sequence) ||\n // Windows ConPTY variations\n sequence === '\\x1bOM' ||\n sequence === '\\x1b[13;2~'\n\n // Also support Ctrl+Enter on Windows (key.ctrl with return)\n if (key.shift || key.meta || key.ctrl || optionPressed || modifierEnterSequence) {\n return getCursor().insert('\\n')\n }\n\n // Heuristic IME guard: many CJK IMEs commit text with Enter, which can also\n // reach the app as a Return keypress. If we just inserted non-ASCII text\n // very recently, treat this Enter as \"commit\" (no-op) rather than submit.\n const now = Date.now()\n if (\n lastNonAsciiInsertRef.current > 0 &&\n now - lastNonAsciiInsertRef.current < IME_ENTER_GUARD_MS\n ) {\n return\n }\n\n onSubmit?.(originalValue)\n }\n\n function shouldDisableCursorMovement(): boolean {\n if (typeof disableCursorMovementForUpDownKeys === 'function') {\n return disableCursorMovementForUpDownKeys()\n }\n return disableCursorMovementForUpDownKeys ?? false\n }\n\n function upOrHistoryUp() {\n if (shouldDisableCursorMovement()) {\n onHistoryUp?.()\n return getCursor()\n }\n const currentCursor = getCursor()\n const { line } = currentCursor.measuredText.getPositionFromOffset(currentCursor.offset)\n\n // If on first line, navigate history instead of moving cursor\n if (line === 0) {\n onHistoryUp?.()\n return currentCursor\n }\n\n // Move cursor up within text\n return currentCursor.up()\n }\n\n function downOrHistoryDown() {\n if (shouldDisableCursorMovement()) {\n onHistoryDown?.()\n return getCursor()\n }\n const currentCursor = getCursor()\n const { line } = currentCursor.measuredText.getPositionFromOffset(currentCursor.offset)\n const lastLine = currentCursor.measuredText.lineCount - 1\n\n // If on last line, navigate history instead of moving cursor\n if (line >= lastLine) {\n onHistoryDown?.()\n return currentCursor\n }\n\n // Move cursor down within text\n return currentCursor.down()\n }\n\n function onInput(input: string, key: Key): void {\n if (key.tab) {\n return // Skip Tab key processing - let completion system handle it\n }\n\n // Direct handling for backspace or delete (which is being detected as delete)\n if (\n key.backspace ||\n key.delete ||\n input === '\\b' ||\n input === '\\x7f' ||\n input === '\\x08'\n ) {\n applyCursor(getCursor().backspace())\n return\n }\n\n const isInsertable = key.insertable && !key.ctrl && !key.meta\n if (isInsertable) {\n const now = Date.now()\n const hasNonAscii = /[^\\x00-\\x7f]/.test(input)\n if (hasNonAscii) {\n lastNonAsciiInsertRef.current = now\n }\n const isComplexInsert = input.length > 1 || hasNonAscii\n if (isComplexInsert) {\n lastComplexInsertRef.current = now\n }\n }\n\n // Handle paste operations - process large input strings more efficiently\n // This prevents cursor position issues when pasting into masked fields\n if (!key.ctrl && !key.meta && input.length > 1) {\n // Likely a paste operation\n const normalized = normalizeLineEndings(input)\n const insertText = multiline ? normalized : normalized.replace(/\\n/g, ' ')\n applyCursor(getCursor().insert(insertText))\n return\n }\n\n const nextCursor = mapKey(key)(input)\n if (nextCursor) {\n applyCursor(nextCursor)\n }\n }\n\n function mapKey(key: Key): (input: string) => MaybeCursor {\n // Direct handling for backspace or delete\n if (key.backspace || key.delete) {\n maybeClearImagePasteErrorTimeout()\n return () => getCursor().backspace()\n }\n\n switch (true) {\n case key.escape:\n return handleEscape\n case key.leftArrow && (key.ctrl || key.meta || ('fn' in key && key.fn)):\n return shouldSuppressNavigation()\n ? () => getCursor()\n : () => getCursor().prevWord()\n case key.rightArrow && (key.ctrl || key.meta || ('fn' in key && key.fn)):\n return shouldSuppressNavigation()\n ? () => getCursor()\n : () => getCursor().nextWord()\n case key.ctrl:\n return handleCtrl\n case 'home' in key && key.home:\n return shouldSuppressNavigation()\n ? () => getCursor()\n : () => getCursor().startOfLine()\n case 'end' in key && key.end:\n return shouldSuppressNavigation()\n ? () => getCursor()\n : () => getCursor().endOfLine()\n case key.pageDown:\n return shouldSuppressNavigation()\n ? () => getCursor()\n : () => getCursor().endOfLine()\n case key.pageUp:\n return shouldSuppressNavigation()\n ? () => getCursor()\n : () => getCursor().startOfLine()\n case key.return:\n return () => handleEnter(key)\n case key.meta:\n return handleMeta\n // Remove Tab handling - let completion system handle it\n case key.upArrow:\n return shouldSuppressNavigation() ? () => getCursor() : upOrHistoryUp\n case key.downArrow:\n return shouldSuppressNavigation()\n ? () => getCursor()\n : downOrHistoryDown\n case key.leftArrow:\n return shouldSuppressNavigation()\n ? () => getCursor()\n : () => getCursor().left()\n case key.rightArrow:\n return shouldSuppressNavigation()\n ? () => getCursor()\n : () => getCursor().right()\n }\n return function (input: string) {\n switch (true) {\n // Home key\n case input == '\\x1b[H' || input == '\\x1b[1~':\n return getCursor().startOfLine()\n // End key\n case input == '\\x1b[F' || input == '\\x1b[4~':\n return getCursor().endOfLine()\n // Handle backspace character explicitly - this is the key fix\n case input === '\\b' || input === '\\x7f' || input === '\\x08':\n maybeClearImagePasteErrorTimeout()\n return getCursor().backspace()\n default:\n return getCursor().insert(input.replace(/\\r/g, '\\n'))\n }\n }\n }\n\n return {\n onInput,\n renderedValue: cursorRef.current.render(cursorChar, mask, invert, {\n maxHeight,\n }),\n offset,\n setOffset,\n }\n}\n", "import { getCachedStringWidth } from '#cli-utils/textWidth'\n\nexport type WrappedText = string[]\nexport type Position = {\n line: number\n column: number\n}\n\nclass WrappedLine {\n constructor(\n public readonly text: string,\n public readonly startOffset: number,\n public readonly isPrecededByNewline: boolean,\n public readonly endsWithNewline: boolean = false,\n ) {}\n\n equals(other: WrappedLine): boolean {\n return this.text === other.text && this.startOffset === other.startOffset\n }\n\n get length(): number {\n return this.text.length + (this.endsWithNewline ? 1 : 0)\n }\n}\n\nexport class MeasuredText {\n private wrappedLines: WrappedLine[]\n\n constructor(\n readonly text: string,\n readonly columns: number,\n ) {\n this.wrappedLines = this.measureWrappedText()\n }\n\n private measureWrappedText(): WrappedLine[] {\n const wrappedLines: WrappedLine[] = []\n const columns = Math.max(1, this.columns)\n\n let lineStartOffset = 0\n let lineText = ''\n let lineWidth = 0\n\n const flushLine = (endsWithNewline: boolean) => {\n const startOffset = lineStartOffset\n const isPrecededByNewline =\n startOffset === 0 || this.text[startOffset - 1] === '\\n'\n wrappedLines.push(\n new WrappedLine(\n lineText,\n startOffset,\n isPrecededByNewline,\n endsWithNewline,\n ),\n )\n lineText = ''\n lineWidth = 0\n }\n\n for (let i = 0; i < this.text.length; ) {\n const codePoint = this.text.codePointAt(i)\n if (codePoint === undefined) break\n const char = String.fromCodePoint(codePoint)\n\n if (char === '\\n') {\n flushLine(true)\n i += char.length\n lineStartOffset = i\n continue\n }\n\n const charWidth = getCachedStringWidth(char)\n if (lineText.length > 0 && lineWidth + charWidth > columns) {\n flushLine(false)\n lineStartOffset = i\n }\n\n lineText += char\n lineWidth += charWidth\n i += char.length\n }\n\n if (\n lineText.length > 0 ||\n wrappedLines.length === 0 ||\n this.text.endsWith('\\n')\n ) {\n flushLine(false)\n }\n\n return wrappedLines\n }\n\n public getWrappedText(): WrappedText {\n return this.wrappedLines.map(line =>\n line.isPrecededByNewline ? line.text : line.text.trimStart(),\n )\n }\n\n private getLine(line: number): WrappedLine {\n return this.wrappedLines[\n Math.max(0, Math.min(line, this.wrappedLines.length - 1))\n ]!\n }\n\n public getOffsetFromPosition(position: Position): number {\n const wrappedLine = this.getLine(position.line)\n const { leadingWhitespaceWidth } =\n this.getLeadingWhitespaceInfo(wrappedLine)\n const targetColumn = Math.max(0, position.column + leadingWhitespaceWidth)\n const startOffsetPlusColumn =\n wrappedLine.startOffset +\n this.getOffsetForColumn(wrappedLine.text, targetColumn)\n\n // Handle blank lines specially\n if (wrappedLine.text.length === 0 && wrappedLine.endsWithNewline) {\n return wrappedLine.startOffset\n }\n\n // For normal lines\n const lineEnd = wrappedLine.startOffset + wrappedLine.text.length\n // Add 1 only if this line ends with a newline\n const maxOffset = wrappedLine.endsWithNewline ? lineEnd + 1 : lineEnd\n\n return Math.min(startOffsetPlusColumn, maxOffset)\n }\n\n public getLineLength(line: number): number {\n const currentLine = this.getLine(line)\n const { leadingWhitespaceWidth } =\n this.getLeadingWhitespaceInfo(currentLine)\n return Math.max(\n 0,\n getCachedStringWidth(currentLine.text) - leadingWhitespaceWidth,\n )\n }\n\n public getPositionFromOffset(offset: number): Position {\n const lines = this.wrappedLines\n for (let line = 0; line < lines.length; line++) {\n const currentLine = lines[line]!\n const nextLine = lines[line + 1]\n if (\n offset >= currentLine.startOffset &&\n (!nextLine || offset < nextLine.startOffset)\n ) {\n const { leadingWhitespaceWidth } =\n this.getLeadingWhitespaceInfo(currentLine)\n const textUpToOffset = this.text.slice(currentLine.startOffset, offset)\n const lineWidth = Math.max(\n 0,\n getCachedStringWidth(currentLine.text) - leadingWhitespaceWidth,\n )\n const column = Math.max(\n 0,\n Math.min(\n getCachedStringWidth(textUpToOffset) - leadingWhitespaceWidth,\n lineWidth,\n ),\n )\n return {\n line,\n column,\n }\n }\n }\n\n // If we're past the last character, return the end of the last line\n const line = lines.length - 1\n return {\n line,\n column: this.getLineLength(line),\n }\n }\n\n public get lineCount(): number {\n return this.wrappedLines.length\n }\n\n equals(other: MeasuredText): boolean {\n return this.text === other.text && this.columns === other.columns\n }\n\n private getLeadingWhitespaceInfo(line: WrappedLine): {\n leadingWhitespaceWidth: number\n } {\n if (line.isPrecededByNewline) {\n return { leadingWhitespaceWidth: 0 }\n }\n const trimmed = line.text.trimStart()\n const leading = line.text.slice(0, line.text.length - trimmed.length)\n return { leadingWhitespaceWidth: getCachedStringWidth(leading) }\n }\n\n private getOffsetForColumn(text: string, column: number): number {\n if (column <= 0) return 0\n let width = 0\n let offset = 0\n for (const char of text) {\n const nextWidth = width + getCachedStringWidth(char)\n if (nextWidth > column) break\n width = nextWidth\n offset += char.length\n }\n return offset\n }\n}\n", "import type { Position } from './Cursor/MeasuredText'\nimport { MeasuredText } from './Cursor/MeasuredText'\nimport { getCachedStringWidth } from '#cli-utils/textWidth'\n\nexport class Cursor {\n readonly offset: number\n\n constructor(\n readonly measuredText: MeasuredText,\n offset: number = 0,\n readonly selection: number = 0,\n ) {\n // it's ok for the cursor to be 1 char beyond the end of the string\n const clamped = Math.max(0, Math.min(this.measuredText.text.length, offset))\n this.offset = normalizeOffset(this.measuredText.text, clamped)\n }\n\n static fromText(\n text: string,\n columns: number,\n offset: number = 0,\n selection: number = 0,\n ): Cursor {\n // make MeasuredText on less than columns width, to account for cursor\n const safeColumns = Math.max(1, columns - 1)\n return new Cursor(new MeasuredText(text, safeColumns), offset, selection)\n }\n\n render(\n cursorChar: string,\n mask: string,\n invert: (text: string) => string,\n options?: { maxHeight?: number },\n ) {\n const { line, column } = this.getPosition()\n const maskChar = mask ? (mask[0] ?? '') : ''\n const renderedLines = this.measuredText\n .getWrappedText()\n .map((text, currentLine, allLines) => {\n let displayText = text\n if (maskChar) {\n displayText = Array.from(displayText)\n .map(() => maskChar)\n .join('')\n }\n // looking for the line with the cursor\n if (line != currentLine) return displayText\n\n const cursorIndex = indexForVisualColumn(displayText, column)\n const cursorCharAtIndex = getCharAt(displayText, cursorIndex)\n const before = displayText.slice(0, cursorIndex)\n const after = displayText.slice(cursorIndex + cursorCharAtIndex.length)\n return before + invert(cursorCharAtIndex || cursorChar) + after\n })\n\n const maxHeight = options?.maxHeight\n if (!maxHeight || maxHeight < 1 || renderedLines.length <= maxHeight) {\n return renderedLines.join('\\n')\n }\n\n const totalLines = renderedLines.length\n const max = Math.max(1, Math.floor(maxHeight))\n\n // Keep the cursor-visible region in view.\n // Prefer positioning the cursor on the last visible content line.\n if (max < 3) {\n const start = Math.max(0, Math.min(line - (max - 1), totalLines - max))\n return renderedLines.slice(start, start + max).join('\\n')\n }\n\n let contentHeight = max\n let start = Math.max(\n 0,\n Math.min(line - (contentHeight - 1), totalLines - contentHeight),\n )\n\n // Iterate a few times to settle on stable indicator placement/content height.\n for (let i = 0; i < 3; i += 1) {\n const hiddenAbove = start > 0\n const hiddenBelow = start + contentHeight < totalLines\n const indicatorCount = (hiddenAbove ? 1 : 0) + (hiddenBelow ? 1 : 0)\n const nextContentHeight = Math.max(1, max - indicatorCount)\n const nextStart = Math.max(\n 0,\n Math.min(\n line - (nextContentHeight - 1),\n totalLines - nextContentHeight,\n ),\n )\n if (nextContentHeight === contentHeight && nextStart === start) {\n break\n }\n contentHeight = nextContentHeight\n start = nextStart\n }\n\n const hiddenAbove = start > 0\n const hiddenBelow = start + contentHeight < totalLines\n const contentEnd = start + contentHeight\n\n const outputLines: string[] = []\n if (hiddenAbove) {\n outputLines.push(`... ${start} lines hidden ...`)\n }\n outputLines.push(...renderedLines.slice(start, contentEnd))\n if (hiddenBelow) {\n outputLines.push(`... ${totalLines - contentEnd} lines hidden ...`)\n }\n return outputLines.join('\\n')\n }\n\n left(): Cursor {\n return new Cursor(\n this.measuredText,\n prevCodePointOffset(this.text, this.offset),\n )\n }\n\n right(): Cursor {\n return new Cursor(\n this.measuredText,\n nextCodePointOffset(this.text, this.offset),\n )\n }\n\n up(): Cursor {\n const { line, column } = this.getPosition()\n if (line == 0) {\n return new Cursor(this.measuredText, 0, 0)\n }\n\n const newOffset = this.getOffset({ line: line - 1, column })\n return new Cursor(this.measuredText, newOffset, 0)\n }\n\n down(): Cursor {\n const { line, column } = this.getPosition()\n if (line >= this.measuredText.lineCount - 1) {\n return new Cursor(this.measuredText, this.text.length, 0)\n }\n\n const newOffset = this.getOffset({ line: line + 1, column })\n return new Cursor(this.measuredText, newOffset, 0)\n }\n\n startOfLine(): Cursor {\n const { line } = this.getPosition()\n return new Cursor(\n this.measuredText,\n this.getOffset({\n line,\n column: 0,\n }),\n 0,\n )\n }\n\n endOfLine(): Cursor {\n const { line } = this.getPosition()\n const column = this.measuredText.getLineLength(line)\n const offset = this.getOffset({ line, column })\n return new Cursor(this.measuredText, offset, 0)\n }\n\n nextWord(): Cursor {\n const text = this.text\n const codePoints = toCodePoints(text)\n let index = offsetToCodePointIndex(text, this.offset)\n\n if (index >= codePoints.length) {\n return this\n }\n\n const currentChar = codePoints[index] ?? ''\n if (isWordCharStrict(currentChar)) {\n while (\n index < codePoints.length &&\n isWordCharWithCombining(codePoints[index] ?? '')\n ) {\n const nextChar = codePoints[index + 1]\n if (\n nextChar &&\n isWordCharStrict(nextChar) &&\n isDifferentScript(codePoints[index] ?? '', nextChar)\n ) {\n index += 1\n break\n }\n index += 1\n }\n } else if (!isWhitespace(currentChar)) {\n while (\n index < codePoints.length &&\n !isWordCharStrict(codePoints[index] ?? '') &&\n !isWhitespace(codePoints[index] ?? '')\n ) {\n index += 1\n }\n }\n\n while (index < codePoints.length && isWhitespace(codePoints[index] ?? '')) {\n index += 1\n }\n\n const offsets = getCodePointOffsets(text)\n const nextOffset = offsets[index] ?? text.length\n return new Cursor(this.measuredText, nextOffset)\n }\n\n prevWord(): Cursor {\n const text = this.text\n const codePoints = toCodePoints(text)\n let index = offsetToCodePointIndex(text, this.offset)\n\n if (index <= 0) {\n return this\n }\n\n index -= 1\n\n while (index >= 0 && isWhitespace(codePoints[index] ?? '')) {\n index -= 1\n }\n\n if (index < 0) {\n return new Cursor(this.measuredText, 0)\n }\n\n if (isWordCharStrict(codePoints[index] ?? '')) {\n while (index >= 0 && isWordCharWithCombining(codePoints[index] ?? '')) {\n const prevChar = codePoints[index - 1]\n if (\n prevChar &&\n isWordCharStrict(prevChar) &&\n isDifferentScript(prevChar, codePoints[index] ?? '')\n ) {\n break\n }\n index -= 1\n }\n index += 1\n } else {\n while (\n index >= 0 &&\n !isWordCharStrict(codePoints[index] ?? '') &&\n !isWhitespace(codePoints[index] ?? '')\n ) {\n index -= 1\n }\n index += 1\n }\n\n const offsets = getCodePointOffsets(text)\n const prevOffset = offsets[index] ?? 0\n return new Cursor(this.measuredText, prevOffset)\n }\n\n private modifyText(end: Cursor, insertString: string = ''): Cursor {\n const startOffset = this.offset\n const endOffset = end.offset\n\n const newText =\n this.text.slice(0, startOffset) +\n insertString +\n this.text.slice(endOffset)\n\n return Cursor.fromText(\n newText,\n this.columns,\n startOffset + insertString.length,\n )\n }\n\n insert(insertString: string): Cursor {\n const newCursor = this.modifyText(this, insertString)\n return newCursor\n }\n\n del(): Cursor {\n if (this.isAtEnd()) {\n return this\n }\n const nextOffset = nextCodePointOffset(this.text, this.offset)\n if (nextOffset === this.offset) {\n return this\n }\n const newText =\n this.text.slice(0, this.offset) + this.text.slice(nextOffset)\n return Cursor.fromText(newText, this.columns, this.offset)\n }\n\n backspace(): Cursor {\n if (this.isAtStart()) {\n return this\n }\n\n // Get the current position\n const currentOffset = this.offset\n\n // Create a new cursor at the position before the current one\n const leftOffset = prevCodePointOffset(this.text, currentOffset)\n\n // Create the new text by removing one character\n const newText =\n this.text.slice(0, leftOffset) + this.text.slice(currentOffset)\n\n // Return a new cursor with the updated text and position\n return Cursor.fromText(newText, this.columns, leftOffset)\n }\n\n deleteToLineStart(): Cursor {\n return this.startOfLine().modifyText(this)\n }\n\n deleteToLineEnd(): Cursor {\n // If cursor is on a newline character, delete just that character\n if (this.text[this.offset] === '\\n') {\n return this.modifyText(this.right())\n }\n\n return this.modifyText(this.endOfLine())\n }\n\n deleteWordBefore(): Cursor {\n if (this.isAtStart()) {\n return this\n }\n return this.prevWord().modifyText(this)\n }\n\n deleteWordAfter(): Cursor {\n if (this.isAtEnd()) {\n return this\n }\n\n return this.modifyText(this.nextWord())\n }\n\n private isOverWordChar(): boolean {\n const currentChar = getCharAt(this.text, this.offset)\n return isWordCharStrict(currentChar)\n }\n\n equals(other: Cursor): boolean {\n return (\n this.offset === other.offset && this.measuredText == other.measuredText\n )\n }\n\n private isAtStart(): boolean {\n return this.offset == 0\n }\n\n private isAtEnd(): boolean {\n return this.offset == this.text.length\n }\n\n public get text(): string {\n return this.measuredText.text\n }\n\n private get columns(): number {\n return this.measuredText.columns + 1\n }\n\n private getPosition(): Position {\n return this.measuredText.getPositionFromOffset(this.offset)\n }\n\n private getOffset(position: Position): number {\n return this.measuredText.getOffsetFromPosition(position)\n }\n}\n\nexport { MeasuredText } from './Cursor/MeasuredText'\n\nexport function countWrappedLines(\n text: string,\n columns: number,\n maxLines?: number,\n): number {\n const safeColumns = Math.max(1, columns - 1)\n const limit =\n typeof maxLines === 'number' && Number.isFinite(maxLines) && maxLines > 0\n ? Math.floor(maxLines)\n : Number.POSITIVE_INFINITY\n\n let lineWidth = 0\n let lineHasContent = false\n let lineCount = 0\n\n const flush = () => {\n lineCount += 1\n lineWidth = 0\n lineHasContent = false\n }\n\n const flushAndMaybeStop = (): boolean => {\n flush()\n return lineCount >= limit\n }\n\n for (let i = 0; i < text.length; ) {\n const codePoint = text.codePointAt(i)\n if (codePoint === undefined) break\n const char = String.fromCodePoint(codePoint)\n\n if (char === '\\n') {\n if (flushAndMaybeStop()) return lineCount\n i += char.length\n continue\n }\n\n const charWidth = getCachedStringWidth(char)\n if (lineHasContent && lineWidth + charWidth > safeColumns) {\n if (flushAndMaybeStop()) return lineCount\n }\n\n lineWidth += charWidth\n lineHasContent = true\n i += char.length\n }\n\n if (lineHasContent || lineCount === 0 || text.endsWith('\\n')) {\n flush()\n }\n\n return Math.min(lineCount, limit)\n}\n\nfunction getCharAt(text: string, index: number): string {\n if (index < 0 || index >= text.length) return ''\n const codePoint = text.codePointAt(index)\n if (codePoint === undefined) return ''\n return String.fromCodePoint(codePoint)\n}\n\nfunction indexForVisualColumn(text: string, column: number): number {\n if (column <= 0) return 0\n let width = 0\n let offset = 0\n for (const char of text) {\n const nextWidth = width + getCachedStringWidth(char)\n if (nextWidth > column) break\n width = nextWidth\n offset += char.length\n }\n return offset\n}\n\nconst CODE_POINT_OFFSETS_CACHE = new Map<string, number[]>()\nconst MAX_CODE_POINT_OFFSETS_CACHE = 200\n\nfunction getCodePointOffsets(text: string): number[] {\n const cached = CODE_POINT_OFFSETS_CACHE.get(text)\n if (cached) return cached\n\n const offsets = [0]\n let offset = 0\n for (const codePoint of text) {\n offset += codePoint.length\n offsets.push(offset)\n }\n\n CODE_POINT_OFFSETS_CACHE.set(text, offsets)\n if (CODE_POINT_OFFSETS_CACHE.size > MAX_CODE_POINT_OFFSETS_CACHE) {\n const firstKey = CODE_POINT_OFFSETS_CACHE.keys().next().value\n if (firstKey !== undefined) {\n CODE_POINT_OFFSETS_CACHE.delete(firstKey)\n }\n }\n\n return offsets\n}\n\nfunction offsetToCodePointIndex(text: string, offset: number): number {\n const offsets = getCodePointOffsets(text)\n for (let i = 0; i < offsets.length; i += 1) {\n if (offsets[i] === offset) {\n return i\n }\n }\n for (let i = offsets.length - 1; i >= 0; i -= 1) {\n if (offsets[i]! < offset) {\n return i\n }\n }\n return offsets.length - 1\n}\n\nfunction normalizeOffset(text: string, offset: number): number {\n const offsets = getCodePointOffsets(text)\n for (let i = offsets.length - 1; i >= 0; i -= 1) {\n if (offsets[i]! <= offset) {\n return offsets[i]!\n }\n }\n return 0\n}\n\nfunction prevCodePointOffset(text: string, offset: number): number {\n if (offset <= 0) return 0\n const offsets = getCodePointOffsets(text)\n for (let i = offsets.length - 1; i >= 0; i -= 1) {\n if (offsets[i]! < offset) {\n return offsets[i]!\n }\n }\n return 0\n}\n\nfunction nextCodePointOffset(text: string, offset: number): number {\n const offsets = getCodePointOffsets(text)\n for (let i = 0; i < offsets.length; i += 1) {\n if (offsets[i]! > offset) {\n return offsets[i]!\n }\n }\n return offsets[offsets.length - 1] ?? 0\n}\n\nfunction toCodePoints(text: string): string[] {\n return Array.from(text)\n}\n\nfunction isWhitespace(char: string): boolean {\n return /\\s/.test(char)\n}\n\nfunction isCombiningMark(char: string): boolean {\n return /\\p{M}/u.test(char)\n}\n\nfunction isWordCharStrict(char: string): boolean {\n return /[\\w\\p{L}\\p{N}]/u.test(char)\n}\n\nfunction isWordCharWithCombining(char: string): boolean {\n return isWordCharStrict(char) || isCombiningMark(char)\n}\n\nfunction getCharScript(char: string): string {\n if (/[\\p{Script=Latin}]/u.test(char)) return 'latin'\n if (/[\\p{Script=Han}]/u.test(char)) return 'han'\n if (/[\\p{Script=Arabic}]/u.test(char)) return 'arabic'\n if (/[\\p{Script=Hiragana}]/u.test(char)) return 'hiragana'\n if (/[\\p{Script=Katakana}]/u.test(char)) return 'katakana'\n if (/[\\p{Script=Cyrillic}]/u.test(char)) return 'cyrillic'\n return 'other'\n}\n\nfunction isDifferentScript(char1: string, char2: string): boolean {\n if (!isWordCharStrict(char1) || !isWordCharStrict(char2)) return false\n return getCharScript(char1) !== getCharScript(char2)\n}\n", "export function mapInput<T>(\n inputMap: Array<[string, (input: string) => T]>,\n defaultHandler: (input: string) => T,\n): (input: string) => T {\n const handlers = new Map(inputMap)\n return (input: string) => (handlers.get(input) ?? defaultHandler)(input)\n}\n", "import { execSync } from 'child_process'\nimport { readFileSync } from 'fs'\n\nconst SCREENSHOT_PATH = '/tmp/kode_cli_latest_screenshot.png'\n\nexport const CLIPBOARD_ERROR_MESSAGE =\n 'No image found in clipboard. Use Cmd + Ctrl + Shift + 4 to copy a screenshot to clipboard.'\n\nexport function getImageFromClipboard(): string | null {\n if (process.platform !== 'darwin') {\n // only support image paste on macOS for now\n return null\n }\n\n try {\n // Check if clipboard has image\n execSync(`osascript -e 'the clipboard as \u00ABclass PNGf\u00BB'`, {\n stdio: 'ignore',\n })\n\n // Save the image\n execSync(\n `osascript -e 'set png_data to (the clipboard as \u00ABclass PNGf\u00BB)' -e 'set fp to open for access POSIX file \"${SCREENSHOT_PATH}\" with write permission' -e 'write png_data to fp' -e 'close access fp'`,\n { stdio: 'ignore' },\n )\n\n // Read the image and convert to base64\n const imageBuffer = readFileSync(SCREENSHOT_PATH)\n const base64Image = imageBuffer.toString('base64')\n\n // Cleanup\n execSync(`rm -f \"${SCREENSHOT_PATH}\"`, { stdio: 'ignore' })\n\n return base64Image\n } catch {\n return null\n }\n}\n", "import type { Cursor } from '#cli-utils/Cursor'\nimport {\n CLIPBOARD_ERROR_MESSAGE,\n getImageFromClipboard,\n} from '#core/utils/imagePaste'\n\nconst IMAGE_PLACEHOLDER = '[Image pasted]'\n\nexport function tryImagePaste({\n cursor,\n mask,\n onImagePaste,\n onMessage,\n setImagePasteErrorTimeout,\n clearImagePasteErrorTimeout,\n}: {\n cursor: Cursor\n mask: string\n onImagePaste?: (base64Image: string) => string | void\n onMessage?: (show: boolean, message?: string) => void\n setImagePasteErrorTimeout: (timeout: NodeJS.Timeout | null) => void\n clearImagePasteErrorTimeout: () => void\n}): Cursor {\n if (mask) {\n return cursor\n }\n\n const base64Image = getImageFromClipboard()\n if (base64Image === null) {\n if (process.platform !== 'darwin') {\n return cursor\n }\n onMessage?.(true, CLIPBOARD_ERROR_MESSAGE)\n clearImagePasteErrorTimeout()\n setImagePasteErrorTimeout(\n setTimeout(() => {\n onMessage?.(false)\n }, 4000),\n )\n return cursor\n }\n\n const placeholder = onImagePaste?.(base64Image)\n return cursor.insert(\n typeof placeholder === 'string' ? placeholder : IMAGE_PLACEHOLDER,\n )\n}\n", "import React from 'react'\nimport {\n normalizeLineEndings,\n shouldTreatAsSpecialPaste,\n} from '#core/utils/paste'\nimport { terminalCapabilityManager } from '#ui-ink/utils/terminalCapabilityManager'\nimport { writeToStdout } from '#cli-utils/stdio'\n\nconst BRACKETED_PASTE_ENABLE = '\\x1b[?2004h'\nconst BRACKETED_PASTE_DISABLE = '\\x1b[?2004l'\nconst BRACKETED_PASTE_START = '\\x1b[200~'\nconst BRACKETED_PASTE_END = '\\x1b[201~'\n// Some input decoders (including Ink in certain terminals) may strip the leading ESC and\n// deliver the CSI sequences as \"[200~\" / \"[201~\". Accept both forms to avoid leaking markers into input.\nconst BRACKETED_PASTE_START_NO_ESC = '[200~'\nconst BRACKETED_PASTE_END_NO_ESC = '[201~'\n\nlet bracketedPasteRefCount = 0\n\nfunction setBracketedPasteEnabled(enabled: boolean) {\n if (!process.stdout?.isTTY) return\n if (!terminalCapabilityManager.isBracketedPasteSupported()) return\n writeToStdout(enabled ? BRACKETED_PASTE_ENABLE : BRACKETED_PASTE_DISABLE)\n}\n\nfunction acquireBracketedPasteMode() {\n if (bracketedPasteRefCount === 0) {\n setBracketedPasteEnabled(true)\n }\n bracketedPasteRefCount++\n}\n\nfunction releaseBracketedPasteMode() {\n bracketedPasteRefCount = Math.max(0, bracketedPasteRefCount - 1)\n if (bracketedPasteRefCount === 0) {\n setBracketedPasteEnabled(false)\n }\n}\n\nexport function useBracketedPasteMode(): void {\n React.useEffect(() => {\n acquireBracketedPasteMode()\n return () => releaseBracketedPasteMode()\n }, [])\n}\n\ntype BracketedPasteState = {\n mode: 'normal' | 'in_paste'\n incomplete: string\n buffer: string\n}\n\nfunction longestSuffixPrefix(haystack: string, needle: string): number {\n const max = Math.min(haystack.length, needle.length - 1)\n for (let len = max; len > 0; len--) {\n if (haystack.endsWith(needle.slice(0, len))) return len\n }\n return 0\n}\n\nfunction findFirstMarker(\n haystack: string,\n markers: string[],\n): { index: number; marker: string } | null {\n let best: { index: number; marker: string } | null = null\n for (const marker of markers) {\n const index = haystack.indexOf(marker)\n if (index === -1) continue\n if (!best || index < best.index) {\n best = { index, marker }\n }\n }\n return best\n}\n\nfunction getSuffixKeepLength(haystack: string, markers: string[]): number {\n let keep = 0\n for (const marker of markers) {\n keep = Math.max(keep, longestSuffixPrefix(haystack, marker))\n }\n return keep\n}\n\nexport type BracketedPasteHandlerOptions = {\n insertText: (text: string) => void\n onPaste?: (text: string) => void\n}\n\nexport function useBracketedPasteSequences({\n insertText,\n onPaste,\n}: BracketedPasteHandlerOptions): (input: string) => boolean {\n const stateRef = React.useRef<BracketedPasteState>({\n mode: 'normal',\n incomplete: '',\n buffer: '',\n })\n\n const flushBracketedPasteBuffer = React.useCallback(\n (rawText: string) => {\n const normalized = normalizeLineEndings(rawText)\n if (onPaste && shouldTreatAsSpecialPaste(normalized)) {\n // Schedule callback after current render to avoid state updates during render\n Promise.resolve().then(() => onPaste(normalized))\n return\n }\n\n // Normal paste: insert directly into input.\n insertText(normalized)\n },\n [insertText, onPaste],\n )\n\n return React.useCallback(\n (input: string): boolean => {\n const state = stateRef.current\n let handledAny = false\n let data = state.incomplete + input\n state.incomplete = ''\n\n const startMarkers = [BRACKETED_PASTE_START, BRACKETED_PASTE_START_NO_ESC]\n const endMarkers = [BRACKETED_PASTE_END, BRACKETED_PASTE_END_NO_ESC]\n\n while (data) {\n if (state.mode === 'normal') {\n const start = findFirstMarker(data, startMarkers)\n if (!start) {\n const keep = getSuffixKeepLength(data, startMarkers)\n if (keep === 0) {\n if (!handledAny) {\n return false\n }\n insertText(data)\n return true\n }\n\n const toInsert = data.slice(0, -keep)\n if (toInsert) {\n insertText(toInsert)\n }\n state.incomplete = data.slice(-keep)\n handledAny = true\n return true\n }\n\n const before = data.slice(0, start.index)\n if (before) {\n insertText(before)\n }\n\n data = data.slice(start.index + start.marker.length)\n state.mode = 'in_paste'\n handledAny = true\n continue\n }\n\n const end = findFirstMarker(data, endMarkers)\n if (!end) {\n const keep = getSuffixKeepLength(data, endMarkers)\n const content = keep > 0 ? data.slice(0, -keep) : data\n if (content) {\n state.buffer += content\n }\n if (keep > 0) {\n state.incomplete = data.slice(-keep)\n }\n handledAny = true\n return true\n }\n\n state.buffer += data.slice(0, end.index)\n const completedPaste = state.buffer\n state.buffer = ''\n state.mode = 'normal'\n\n flushBracketedPasteBuffer(completedPaste)\n\n data = data.slice(end.index + end.marker.length)\n handledAny = true\n continue\n }\n\n return true\n },\n [flushBracketedPasteBuffer, insertText],\n )\n}\n", "export type InkInstanceLike = {\n pause?: () => void\n resume?: () => void\n suspendStdin?: () => void\n resumeStdin?: () => void\n}\n\nconst instances = new WeakMap<NodeJS.WriteStream, unknown>()\n\nexport function setInkInstanceForStdout(\n stdout: NodeJS.WriteStream,\n instance: unknown,\n): void {\n instances.set(stdout, instance)\n}\n\nexport function getInkInstanceForStdout(\n stdout: NodeJS.WriteStream,\n): InkInstanceLike | undefined {\n return instances.get(stdout) as InkInstanceLike | undefined\n}\n", "import { Box, Text } from 'ink'\nimport React, { type ReactNode } from 'react'\nimport { SelectOption } from './select-option'\nimport { type Theme } from './theme'\nimport { useSelectState } from './use-select-state'\nimport { useSelect } from './use-select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '#core/utils/theme'\n\nexport type OptionSubtree = {\n /**\n * Header to show above sub-options.\n */\n readonly header?: string\n\n /**\n * Options.\n */\n readonly options: (Option | OptionSubtree)[]\n}\n\nexport type OptionHeader = {\n readonly header: string\n\n readonly optionValues: string[]\n}\n\nexport const optionHeaderKey = (optionHeader: OptionHeader): string =>\n `HEADER-${optionHeader.optionValues.join(',')}`\n\nexport type SelectProps = {\n /**\n * When disabled, user input is ignored.\n *\n * @default false\n */\n readonly isDisabled?: boolean\n\n /**\n * Number of visible options.\n *\n * @default 5\n */\n readonly visibleOptionCount?: number\n\n /**\n * Highlight text in option labels.\n */\n readonly highlightText?: string\n\n /**\n * Options.\n */\n readonly options: (Option | OptionSubtree)[]\n\n /**\n * Default value.\n */\n readonly defaultValue?: string\n\n /**\n * Callback when selected option changes.\n */\n readonly onChange?: (value: string) => void\n\n /**\n * Callback when focused option changes.\n */\n readonly onFocus?: (value: string) => void\n\n /**\n * Value to focus\n */\n readonly focusValue?: string\n}\n\nexport function Select({\n isDisabled = false,\n visibleOptionCount = 5,\n highlightText,\n options,\n defaultValue,\n onChange,\n onFocus,\n focusValue,\n}: SelectProps) {\n const state = useSelectState({\n visibleOptionCount,\n options,\n defaultValue,\n onChange,\n onFocus,\n focusValue,\n })\n\n useSelect({ isDisabled, state })\n\n const appTheme = getTheme()\n const styles = {\n container: () => ({\n flexDirection: 'column' as const,\n }),\n highlightedText: () => ({\n color: appTheme.text,\n backgroundColor: appTheme.warning,\n }),\n }\n\n return (\n <Box {...styles.container()}>\n {state.visibleOptions.map(option => {\n const key = 'value' in option ? option.value : optionHeaderKey(option)\n const isFocused =\n !isDisabled &&\n state.focusedValue !== undefined &&\n ('value' in option\n ? state.focusedValue === option.value\n : option.optionValues.includes(state.focusedValue))\n const isSelected =\n !!state.value &&\n ('value' in option\n ? state.value === option.value\n : option.optionValues.includes(state.value))\n const smallPointer = 'header' in option\n const labelText = 'label' in option ? option.label : option.header\n let label: ReactNode = labelText\n\n if (highlightText && labelText.includes(highlightText)) {\n const index = labelText.indexOf(highlightText)\n\n label = (\n <>\n {labelText.slice(0, index)}\n <Text {...styles.highlightedText()}>{highlightText}</Text>\n {labelText.slice(index + highlightText.length)}\n </>\n )\n }\n\n return (\n <SelectOption\n key={key}\n isFocused={isFocused}\n isSelected={isSelected}\n smallPointer={smallPointer}\n children={label}\n />\n )\n })}\n </Box>\n )\n}\n", "import figures from 'figures'\nimport { Box, Text } from 'ink'\nimport React, { type ReactNode } from 'react'\nimport { type Theme } from './theme'\nimport { getTheme } from '#core/utils/theme'\n\nexport type SelectOptionProps = {\n /**\n * Determines if option is focused.\n */\n readonly isFocused: boolean\n\n /**\n * Determines if option is selected.\n */\n readonly isSelected: boolean\n\n /**\n * Determines if pointer is shown when selected\n */\n readonly smallPointer?: boolean\n\n /**\n * Option label.\n */\n readonly children: ReactNode\n\n /**\n * React key prop (handled internally by React)\n */\n readonly key?: React.Key\n}\n\nexport function SelectOption({\n isFocused,\n isSelected,\n smallPointer,\n children,\n ...props\n}: SelectOptionProps) {\n const appTheme = getTheme()\n const styles = {\n option: ({ isFocused }: { isFocused: boolean }) => ({\n paddingLeft: 2,\n paddingRight: 1,\n }),\n focusIndicator: () => ({\n color: appTheme.kode,\n }),\n label: ({\n isFocused,\n isSelected,\n }: {\n isFocused: boolean\n isSelected: boolean\n }) => ({\n color: isSelected\n ? appTheme.success\n : isFocused\n ? appTheme.kode\n : appTheme.text,\n bold: isSelected,\n }),\n selectedIndicator: () => ({\n color: appTheme.success,\n }),\n }\n\n return (\n <Box {...styles.option({ isFocused })}>\n {isFocused && (\n <Text {...styles.focusIndicator()}>\n {smallPointer ? figures.triangleDownSmall : figures.pointer}\n </Text>\n )}\n\n <Text {...styles.label({ isFocused, isSelected })} wrap=\"truncate-end\">\n {children}\n </Text>\n\n {isSelected && (\n <Text {...styles.selectedIndicator()}>{figures.tick}</Text>\n )}\n </Box>\n )\n}\n", "import { isDeepStrictEqual } from 'node:util'\nimport {\n useReducer,\n type Reducer,\n useCallback,\n useMemo,\n useState,\n useEffect,\n} from 'react'\nimport OptionMap from './option-map'\nimport { Option } from '@inkjs/ui'\nimport type { OptionHeader, OptionSubtree } from './select'\nimport {\n createDefaultState,\n flattenOptions,\n type DefaultSelectState,\n} from './select-state'\n\ntype State = DefaultSelectState\n\ntype Action =\n | { type: 'focus-next-option' }\n | { type: 'focus-previous-option' }\n | { type: 'select-focused-option' }\n | { type: 'set-focus'; value: string }\n | { type: 'reset'; state: State }\n\nconst reducer: Reducer<State, Action> = (state, action) => {\n switch (action.type) {\n case 'focus-next-option': {\n if (!state.focusedValue) {\n return state\n }\n\n const item = state.optionMap.get(state.focusedValue)\n\n if (!item) {\n return state\n }\n\n let next = item.next\n while (next && !('value' in next)) {\n // Skip headers\n next = next.next\n }\n\n if (!next || !('value' in next)) {\n return state\n }\n\n const needsToScroll = next.index >= state.visibleToIndex\n\n if (!needsToScroll) {\n return {\n ...state,\n focusedValue: next.value,\n }\n }\n\n const nextVisibleToIndex = Math.min(\n state.optionMap.size,\n state.visibleToIndex + 1,\n )\n\n const nextVisibleFromIndex = nextVisibleToIndex - state.visibleOptionCount\n\n return {\n ...state,\n focusedValue: next.value,\n visibleFromIndex: nextVisibleFromIndex,\n visibleToIndex: nextVisibleToIndex,\n }\n }\n\n case 'focus-previous-option': {\n if (!state.focusedValue) {\n return state\n }\n\n const item = state.optionMap.get(state.focusedValue)\n\n if (!item) {\n return state\n }\n\n let previous = item.previous\n while (previous && !('value' in previous)) {\n // Skip headers\n previous = previous.previous\n }\n\n if (!previous || !('value' in previous)) {\n return state\n }\n\n const needsToScroll = previous.index <= state.visibleFromIndex\n\n if (!needsToScroll) {\n return {\n ...state,\n focusedValue: previous.value,\n }\n }\n\n const nextVisibleFromIndex = Math.max(0, state.visibleFromIndex - 1)\n\n const nextVisibleToIndex = nextVisibleFromIndex + state.visibleOptionCount\n\n return {\n ...state,\n focusedValue: previous.value,\n visibleFromIndex: nextVisibleFromIndex,\n visibleToIndex: nextVisibleToIndex,\n }\n }\n\n case 'select-focused-option': {\n return {\n ...state,\n previousValue: state.value,\n value: state.focusedValue,\n }\n }\n\n case 'reset': {\n return action.state\n }\n\n case 'set-focus': {\n return {\n ...state,\n focusedValue: action.value,\n }\n }\n }\n}\n\nexport type UseSelectStateProps = {\n /**\n * Number of items to display.\n *\n * @default 5\n */\n visibleOptionCount?: number\n\n /**\n * Options.\n */\n options: (Option | OptionSubtree)[]\n\n /**\n * Initially selected option's value.\n */\n defaultValue?: string\n\n /**\n * Callback for selecting an option.\n */\n onChange?: (value: string) => void\n\n /**\n * Callback for focusing an option.\n */\n onFocus?: (value: string) => void\n\n /**\n * Value to focus\n */\n focusValue?: string\n}\n\nexport type SelectState = Pick<\n State,\n 'focusedValue' | 'visibleFromIndex' | 'visibleToIndex' | 'value'\n> & {\n /**\n * Visible options.\n */\n visibleOptions: Array<(Option | OptionHeader) & { index: number }>\n\n /**\n * Focus next option and scroll the list down, if needed.\n */\n focusNextOption: () => void\n\n /**\n * Focus previous option and scroll the list up, if needed.\n */\n focusPreviousOption: () => void\n\n /**\n * Select currently focused option.\n */\n selectFocusedOption: () => void\n}\n\nexport const useSelectState = ({\n visibleOptionCount = 5,\n options,\n defaultValue,\n onChange,\n onFocus,\n focusValue,\n}: UseSelectStateProps) => {\n const flatOptions = flattenOptions(options)\n\n const [state, dispatch] = useReducer(\n reducer,\n { visibleOptionCount, defaultValue, options },\n createDefaultState,\n )\n\n const [lastOptions, setLastOptions] = useState(flatOptions)\n\n if (\n flatOptions !== lastOptions &&\n !isDeepStrictEqual(flatOptions, lastOptions)\n ) {\n dispatch({\n type: 'reset',\n state: createDefaultState({ visibleOptionCount, defaultValue, options }),\n })\n\n setLastOptions(flatOptions)\n }\n\n const focusNextOption = useCallback(() => {\n dispatch({\n type: 'focus-next-option',\n })\n }, [])\n\n const focusPreviousOption = useCallback(() => {\n dispatch({\n type: 'focus-previous-option',\n })\n }, [])\n\n const selectFocusedOption = useCallback(() => {\n dispatch({\n type: 'select-focused-option',\n })\n }, [])\n\n const visibleOptions = useMemo(() => {\n return flatOptions\n .map((option, index) => ({\n ...option,\n index,\n }))\n .slice(state.visibleFromIndex, state.visibleToIndex)\n }, [flatOptions, state.visibleFromIndex, state.visibleToIndex])\n\n useEffect(() => {\n if (state.value && state.previousValue !== state.value) {\n onChange?.(state.value)\n }\n }, [state.previousValue, state.value, options, onChange])\n\n useEffect(() => {\n if (state.focusedValue) {\n onFocus?.(state.focusedValue)\n }\n }, [state.focusedValue, onFocus])\n\n useEffect(() => {\n if (focusValue) {\n dispatch({\n type: 'set-focus',\n value: focusValue,\n })\n }\n }, [focusValue])\n\n return {\n focusedValue: state.focusedValue,\n visibleFromIndex: state.visibleFromIndex,\n visibleToIndex: state.visibleToIndex,\n value: state.value,\n visibleOptions,\n focusNextOption,\n focusPreviousOption,\n selectFocusedOption,\n }\n}\n", "import { type Option } from '@inkjs/ui'\nimport { optionHeaderKey, type OptionHeader } from './select'\n\ntype OptionMapItem = (Option | OptionHeader) & {\n previous: OptionMapItem | undefined\n next: OptionMapItem | undefined\n index: number\n}\n\nexport default class OptionMap extends Map<string, OptionMapItem> {\n readonly first: OptionMapItem | undefined\n\n constructor(options: (Option | OptionHeader)[]) {\n const items: Array<[string, OptionMapItem]> = []\n let firstItem: OptionMapItem | undefined\n let previous: OptionMapItem | undefined\n let index = 0\n\n for (const option of options) {\n const item = {\n ...option,\n previous,\n next: undefined,\n index,\n }\n\n if (previous) {\n previous.next = item\n }\n\n firstItem ||= item\n\n const key = 'value' in option ? option.value : optionHeaderKey(option)\n items.push([key, item])\n index++\n previous = item\n }\n\n super(items)\n this.first = firstItem\n }\n}\n", "import { Option } from '@inkjs/ui'\nimport OptionMap from './option-map'\nimport type { OptionHeader, OptionSubtree } from './select'\n\nexport type FlatOption = Option | OptionHeader\n\nexport type DefaultSelectState = {\n /**\n * Map where key is option's value and value is option's index.\n */\n optionMap: OptionMap\n\n /**\n * Number of visible options.\n */\n visibleOptionCount: number\n\n /**\n * Value of the currently focused option.\n */\n focusedValue: string | undefined\n\n /**\n * Index of the first visible option.\n */\n visibleFromIndex: number\n\n /**\n * Index of the last visible option.\n */\n visibleToIndex: number\n\n /**\n * Value of the previously selected option.\n */\n previousValue: string | undefined\n\n /**\n * Value of the selected option.\n */\n value: string | undefined\n}\n\nexport const flattenOptions = (\n options: (Option | OptionSubtree)[],\n): FlatOption[] =>\n options.flatMap(option => {\n if ('options' in option) {\n const flatSubtree = flattenOptions(option.options)\n const optionValues = flatSubtree.flatMap(o =>\n 'value' in o ? o.value : [],\n )\n const header =\n option.header !== undefined\n ? [{ header: option.header, optionValues }]\n : []\n\n return [...header, ...flatSubtree]\n }\n\n return option\n })\n\nexport type CreateDefaultStateInput = {\n visibleOptionCount?: number\n options: (Option | OptionSubtree)[]\n defaultValue?: string\n}\n\nexport const createDefaultState = ({\n visibleOptionCount: customVisibleOptionCount,\n defaultValue,\n options,\n}: CreateDefaultStateInput): DefaultSelectState => {\n const flatOptions = flattenOptions(options)\n\n const visibleOptionCount =\n typeof customVisibleOptionCount === 'number'\n ? Math.min(customVisibleOptionCount, flatOptions.length)\n : flatOptions.length\n\n const optionMap = new OptionMap(flatOptions)\n const firstOption = optionMap.first\n\n // Use defaultValue for focusedValue if it exists and is valid, otherwise use first option\n let focusedValue: string | undefined\n if (defaultValue && optionMap.get(defaultValue)) {\n focusedValue = defaultValue\n } else {\n focusedValue =\n firstOption && 'value' in firstOption ? firstOption.value : undefined\n }\n\n // Calculate visible range based on focused value\n let visibleFromIndex = 0\n let visibleToIndex = visibleOptionCount\n\n if (focusedValue && optionMap.get(focusedValue)) {\n const focusedIndex = optionMap.get(focusedValue)!.index\n // Center the focused option in the visible area if possible\n const halfVisible = Math.floor(visibleOptionCount / 2)\n visibleFromIndex = Math.max(0, focusedIndex - halfVisible)\n visibleToIndex = Math.min(\n flatOptions.length,\n visibleFromIndex + visibleOptionCount,\n )\n\n // Adjust if we can't show enough items at the end\n if (visibleToIndex - visibleFromIndex < visibleOptionCount) {\n visibleFromIndex = Math.max(0, visibleToIndex - visibleOptionCount)\n }\n }\n\n return {\n optionMap,\n visibleOptionCount,\n focusedValue,\n visibleFromIndex,\n visibleToIndex,\n previousValue: undefined,\n value: undefined,\n }\n}\n", "import { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { type SelectState } from './use-select-state'\n\nexport type UseSelectProps = {\n /**\n * When disabled, user input is ignored.\n *\n * @default false\n */\n isDisabled?: boolean\n\n /**\n * Select state.\n */\n state: SelectState\n}\n\nexport const useSelect = ({ isDisabled = false, state }: UseSelectProps) => {\n useKeypress(\n (_input, key) => {\n if (key.downArrow) {\n state.focusNextOption()\n return true\n }\n\n if (key.upArrow) {\n state.focusPreviousOption()\n return true\n }\n\n if (key.return) {\n state.selectFocusedOption()\n return true\n }\n },\n { isActive: !isDisabled },\n )\n}\n", "import React, { useState } from 'react'\nimport { PRODUCT_NAME } from '#core/constants/product'\nimport { Box, Text } from 'ink'\nimport {\n DEFAULT_GLOBAL_CONFIG,\n getGlobalConfig,\n saveGlobalConfig,\n} from '#core/utils/config'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport { StructuredDiff } from '#ui-ink/components/StructuredDiff'\nimport type { ThemeNames } from '#core/utils/theme'\nimport { ModelSelector } from '#ui-ink/components/ModelSelector'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { ScreenFrame } from '#ui-ink/primitives/layout/ScreenFrame'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\n\ntype Props = {\n onDone(result?: { skipped: boolean }): void\n}\n\nexport function OnboardingScreen({ onDone }: Props): React.ReactNode {\n const layout = useScreenLayout()\n const [showModelSelector, setShowModelSelector] = useState(false)\n const config = getGlobalConfig()\n\n const [selectedTheme, setSelectedTheme] = useState(\n DEFAULT_GLOBAL_CONFIG.theme,\n )\n\n function handleThemeSelection(newTheme: string) {\n saveGlobalConfig({\n ...config,\n theme: newTheme as ThemeNames,\n })\n setShowModelSelector(true)\n }\n\n function handleThemePreview(newTheme: string) {\n setSelectedTheme(newTheme as ThemeNames)\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n const bodyWidth = Math.max(\n 1,\n Math.min(70, layout.columns - layout.paddingX * 2),\n )\n const diffWidth = Math.max(24, Math.min(60, bodyWidth))\n\n useKeypress(\n (_input, key) => {\n if (key.escape) {\n onDone({ skipped: true })\n return true\n }\n },\n { isActive: !showModelSelector },\n )\n\n // Define all onboarding steps\n const themeStep = (\n <Box flexDirection=\"column\" gap={layout.gap}>\n <Text>Let&apos;s get started.</Text>\n <Box flexDirection=\"column\">\n <Text bold>Choose the option that looks best when you select it:</Text>\n <Text dimColor>To change this later, run /config</Text>\n </Box>\n <Select\n options={[\n { label: 'Light text', value: 'dark' },\n { label: 'Dark text', value: 'light' },\n {\n label: 'Light text (colorblind-friendly)',\n value: 'dark-daltonized',\n },\n {\n label: 'Dark text (colorblind-friendly)',\n value: 'light-daltonized',\n },\n ]}\n onFocus={handleThemePreview}\n onChange={handleThemeSelection}\n />\n <Box flexDirection=\"column\">\n <Box paddingLeft={0} marginRight={0} flexDirection=\"column\">\n <StructuredDiff\n patch={{\n oldStart: 1,\n newStart: 1,\n oldLines: 3,\n newLines: 3,\n lines: [\n 'function greet() {',\n '- console.log(\"Hello, World!\");',\n '+ console.log(\"Hello, anon!\");',\n '}',\n ],\n }}\n dim={false}\n width={diffWidth}\n overrideTheme={selectedTheme}\n />\n </Box>\n </Box>\n </Box>\n )\n\n // If we're showing the model selector screen, render it directly\n if (showModelSelector) {\n return (\n <ModelSelector\n onDone={() => onDone({ skipped: false })}\n skipModelType={true}\n isOnboarding={true}\n />\n )\n }\n\n return (\n <ScreenFrame\n title={PRODUCT_NAME}\n exitState={exitState}\n paddingX={layout.paddingX}\n paddingY={layout.paddingY}\n gap={layout.gap}\n >\n {themeStep}\n <Box marginTop={layout.gap} flexDirection=\"column\">\n <Text dimColor wrap=\"truncate-end\">\n Enter select \u00B7 Esc skip\n </Text>\n <Text dimColor wrap=\"truncate-end\">\n Tip: you can change this later with /config and /model.\n </Text>\n </Box>\n </ScreenFrame>\n )\n}\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { Hunk } from 'diff'\nimport { getTheme, ThemeNames } from '#core/utils/theme'\nimport { useMemo } from 'react'\nimport { wrapLines } from '#ui-ink/primitives/text/wrapLines'\n\ntype Props = {\n patch: Hunk\n dim: boolean\n width: number\n overrideTheme?: ThemeNames // custom theme for previews\n key?: React.Key\n}\n\nexport function StructuredDiff({\n patch,\n dim,\n width,\n overrideTheme,\n}: Props): React.ReactNode {\n const diff = useMemo(\n () => structuredDiffLines({ patch, width, dim, overrideTheme }),\n [patch.lines, patch.oldStart, width, dim, overrideTheme],\n )\n\n return diff.map((_, i) => <Box key={i}>{_}</Box>)\n}\n\nexport function structuredDiffLines(args: {\n patch: Hunk\n width: number\n dim: boolean\n overrideTheme?: ThemeNames\n}): React.ReactNode[] {\n return formatDiff(\n args.patch.lines,\n args.patch.oldStart,\n args.width,\n args.dim,\n args.overrideTheme,\n )\n}\n\nfunction formatDiff(\n lines: string[],\n startingLineNumber: number,\n width: number,\n dim: boolean,\n overrideTheme?: ThemeNames,\n): React.ReactNode[] {\n const theme = getTheme(overrideTheme)\n\n const ls = numberDiffLines(\n lines.map(code => {\n if (code.startsWith('+')) {\n return {\n code: ' ' + code.slice(1),\n i: 0,\n type: 'add',\n }\n }\n if (code.startsWith('-')) {\n return {\n code: ' ' + code.slice(1),\n i: 0,\n type: 'remove',\n }\n }\n return { code, i: 0, type: 'nochange' }\n }),\n startingLineNumber,\n )\n\n const maxLineNumber = Math.max(...ls.map(({ i }) => i))\n const maxWidth = maxLineNumber.toString().length\n\n return ls.flatMap(({ type, code, i }) => {\n const wrappedLines = wrapLines([code], Math.max(1, width - maxWidth))\n return wrappedLines.map((line, lineIndex) => {\n const key = `${type}-${i}-${lineIndex}`\n switch (type) {\n case 'add':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n backgroundColor={\n dim ? theme.diff.addedDimmed : theme.diff.added\n }\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n case 'remove':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n backgroundColor={\n dim ? theme.diff.removedDimmed : theme.diff.removed\n }\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n case 'nochange':\n return (\n <React.Fragment key={key}>\n <Text>\n <LineNumber\n i={lineIndex === 0 ? i : undefined}\n width={maxWidth}\n />\n <Text\n color={overrideTheme ? theme.text : undefined}\n dimColor={dim}\n >\n {line}\n </Text>\n </Text>\n </React.Fragment>\n )\n }\n })\n })\n}\n\nfunction LineNumber({\n i,\n width,\n}: {\n i: number | undefined\n width: number\n}): React.ReactNode {\n return (\n <Text color={getTheme().secondaryText}>\n {i !== undefined ? i.toString().padStart(width) : ' '.repeat(width)}{' '}\n </Text>\n )\n}\n\nfunction numberDiffLines(\n diff: { code: string; type: string }[],\n startLine: number,\n): { code: string; type: string; i: number }[] {\n let i = startLine\n const result: { code: string; type: string; i: number }[] = []\n const queue = [...diff]\n\n while (queue.length > 0) {\n const { code, type } = queue.shift()!\n const line = {\n code: code,\n type,\n i,\n }\n\n // Update counters based on change type\n switch (type) {\n case 'nochange':\n i++\n result.push(line)\n break\n case 'add':\n i++\n result.push(line)\n break\n case 'remove': {\n result.push(line)\n let numRemoved = 0\n while (queue[0]?.type === 'remove') {\n i++\n const { code, type } = queue.shift()!\n const line = {\n code: code,\n type,\n i,\n }\n result.push(line)\n numRemoved++\n }\n i -= numRemoved\n break\n }\n }\n }\n\n return result\n}\n", "import type { ReactNode } from 'react'\nimport * as React from 'react'\nimport type { ModelSelectorProps } from './types'\nimport { ModelSelectorView } from './ModelSelectorView'\nimport { useModelSelectorController } from './useModelSelectorController'\n\nexport function ModelSelector(props: ModelSelectorProps): ReactNode {\n const viewProps = useModelSelectorController(props)\n return <ModelSelectorView {...viewProps} />\n}\n", "import * as React from 'react'\nimport { Box, Text } from 'ink'\nimport figures from 'figures'\nimport { ApiKeyScreen } from './flow/screens/ApiKeyScreen'\nimport { BaseUrlScreen } from './flow/screens/BaseUrlScreen'\nimport { ConfirmationScreen } from './flow/screens/ConfirmationScreen'\nimport { ConnectionTestScreen } from './flow/screens/ConnectionTestScreen'\nimport { ContextLengthScreen } from './flow/screens/ContextLengthScreen'\nimport { ModelInputScreen } from './flow/screens/ModelInputScreen'\nimport { ModelParamsScreen } from './flow/screens/ModelParamsScreen'\nimport { ModelSelectionScreen } from './flow/screens/ModelSelectionScreen'\nimport { PartnerCodingPlansScreen } from './flow/screens/PartnerCodingPlansScreen'\nimport { PartnerProvidersScreen } from './flow/screens/PartnerProvidersScreen'\nimport { ProviderSelectionScreen } from './flow/screens/ProviderSelectionScreen'\nimport { ResourceNameScreen } from './flow/screens/ResourceNameScreen'\nimport type { Option, ModelSelectorViewProps } from './viewTypes'\n\nexport function ModelSelectorView(\n props: ModelSelectorViewProps,\n): React.ReactNode {\n const VIEWPORT_SAFE_MARGIN_ROWS = 2\n\n type WindowedOptionsLayout = {\n visibleOptionCount: number\n showIndicators: boolean\n }\n\n function getWindowedOptionsLayout(\n requestedCount: number,\n optionLength: number,\n reservedLines: number = 10,\n ): WindowedOptionsLayout {\n const rows = props.terminalRows\n // Keep spare rows to avoid Ink terminal-scroll tearing when the UI is near full-height.\n // 1 row is often not enough across terminals (prompt, IME, and line-wrap quirks), so we\n // use 2 as a conservative default.\n const maxListLines = Math.max(\n 1,\n rows - reservedLines - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n\n const canShowIndicators = maxListLines >= 3\n\n // Reserve 2 rows for stable up/down indicators whenever we have enough room.\n // This keeps list layout consistent across sub-screens.\n const indicatorReserve = canShowIndicators ? 2 : 0\n\n const visibleOptionCount = Math.max(\n 1,\n Math.min(requestedCount, optionLength, maxListLines - indicatorReserve),\n )\n\n return {\n visibleOptionCount,\n // Always render indicator rows when we reserved space; show arrows only when truncated.\n showIndicators: indicatorReserve === 2,\n }\n }\n\n function renderWindowedOptions(\n options: Option[],\n focusedIndex: number,\n layout: WindowedOptionsLayout,\n ) {\n if (options.length === 0) {\n return (\n <Text color={props.theme.secondaryText}>No options available.</Text>\n )\n }\n\n const visibleCount = Math.max(\n 1,\n Math.min(layout.visibleOptionCount, options.length),\n )\n const clampedFocus =\n options.length === 0\n ? 0\n : Math.max(0, Math.min(focusedIndex, options.length - 1))\n const half = Math.floor(visibleCount / 2)\n const start = Math.max(\n 0,\n Math.min(clampedFocus - half, Math.max(0, options.length - visibleCount)),\n )\n const end = Math.min(options.length, start + visibleCount)\n const showUp = layout.showIndicators && start > 0\n const showDown = layout.showIndicators && end < options.length\n\n const visibleOptions = options.slice(start, end)\n const missingRows = Math.max(0, visibleCount - visibleOptions.length)\n\n return (\n <Box flexDirection=\"column\" gap={0}>\n {layout.showIndicators ? (\n <Text color={props.theme.secondaryText}>\n {showUp ? `${figures.arrowUp} More` : ' '}\n </Text>\n ) : null}\n {visibleOptions.map((opt, idx) => {\n const absoluteIndex = start + idx\n const isFocused = absoluteIndex === focusedIndex\n return (\n <Box key={opt.value} flexDirection=\"row\">\n <Text\n color={isFocused ? props.theme.kode : props.theme.secondaryText}\n >\n {isFocused ? figures.pointer : ' '}\n </Text>\n <Text\n color={isFocused ? props.theme.text : props.theme.secondaryText}\n bold={isFocused}\n wrap=\"truncate-end\"\n >\n {' '}\n {opt.label}\n </Text>\n </Box>\n )\n })}\n {missingRows > 0\n ? Array.from({ length: missingRows }).map((_, idx) => (\n <Box key={`empty-${idx}`} flexDirection=\"row\">\n <Text> </Text>\n </Box>\n ))\n : null}\n {layout.showIndicators ? (\n <Text color={props.theme.secondaryText}>\n {showDown ? `${figures.arrowDown} More` : ' '}\n </Text>\n ) : null}\n </Box>\n )\n }\n\n const minHeight = Math.max(1, props.terminalRows)\n const screen = (() => {\n if (props.currentScreen === 'apiKey') {\n return (\n <ApiKeyScreen\n theme={props.theme}\n exitState={props.exitState}\n terminalColumns={props.terminalColumns}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n selectedProvider={props.selectedProvider}\n apiKey={props.apiKey}\n cursorOffset={props.cursorOffset}\n handleApiKeyChange={props.handleApiKeyChange}\n handleApiKeySubmit={props.handleApiKeySubmit}\n handleCursorOffsetChange={props.handleCursorOffsetChange}\n apiKeyCleanedNotification={props.apiKeyCleanedNotification}\n isLoadingModels={props.isLoadingModels}\n providerBaseUrl={props.providerBaseUrl}\n modelLoadError={props.modelLoadError}\n formatApiKeyDisplay={props.formatApiKeyDisplay}\n getProviderLabel={props.getProviderLabel}\n />\n )\n }\n\n if (props.currentScreen === 'model') {\n return (\n <ModelSelectionScreen\n theme={props.theme}\n exitState={props.exitState}\n terminalRows={props.terminalRows}\n terminalColumns={props.terminalColumns}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n selectedProvider={props.selectedProvider}\n availableModels={props.availableModels}\n modelSearchQuery={props.modelSearchQuery}\n modelSearchCursorOffset={props.modelSearchCursorOffset}\n handleModelSearchChange={props.handleModelSearchChange}\n handleModelSearchCursorOffsetChange={\n props.handleModelSearchCursorOffsetChange\n }\n modelOptions={props.modelOptions}\n handleModelSelection={props.handleModelSelection}\n getProviderLabel={props.getProviderLabel}\n />\n )\n }\n\n if (props.currentScreen === 'modelParams') {\n const formFields = props.getFormFieldsForModelParams()\n return (\n <ModelParamsScreen\n theme={props.theme}\n exitState={props.exitState}\n terminalRows={props.terminalRows}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n selectedModel={props.selectedModel}\n formFields={formFields}\n activeFieldIndex={props.activeFieldIndex}\n setActiveFieldIndex={props.setActiveFieldIndex}\n maxTokens={props.maxTokens}\n setMaxTokens={props.setMaxTokens}\n setSelectedMaxTokensPreset={props.setSelectedMaxTokensPreset}\n setMaxTokensCursorOffset={props.setMaxTokensCursorOffset}\n reasoningEffortOptions={props.reasoningEffortOptions}\n reasoningEffort={props.reasoningEffort}\n setReasoningEffort={props.setReasoningEffort}\n requestStrategyOptions={props.requestStrategyOptions}\n requestStrategy={props.requestStrategy}\n setRequestStrategy={props.setRequestStrategy}\n />\n )\n }\n\n if (props.currentScreen === 'resourceName') {\n return (\n <ResourceNameScreen\n theme={props.theme}\n exitState={props.exitState}\n terminalColumns={props.terminalColumns}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n resourceName={props.resourceName}\n setResourceName={props.setResourceName}\n handleResourceNameSubmit={props.handleResourceNameSubmit}\n resourceNameCursorOffset={props.resourceNameCursorOffset}\n setResourceNameCursorOffset={props.setResourceNameCursorOffset}\n />\n )\n }\n\n if (props.currentScreen === 'baseUrl') {\n return (\n <BaseUrlScreen\n theme={props.theme}\n exitState={props.exitState}\n terminalColumns={props.terminalColumns}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n selectedProvider={props.selectedProvider}\n isLoadingModels={props.isLoadingModels}\n modelLoadError={props.modelLoadError}\n customBaseUrl={props.customBaseUrl}\n setCustomBaseUrl={props.setCustomBaseUrl}\n handleCustomBaseUrlSubmit={props.handleCustomBaseUrlSubmit}\n customBaseUrlCursorOffset={props.customBaseUrlCursorOffset}\n setCustomBaseUrlCursorOffset={props.setCustomBaseUrlCursorOffset}\n providerBaseUrl={props.providerBaseUrl}\n setProviderBaseUrl={props.setProviderBaseUrl}\n handleProviderBaseUrlSubmit={props.handleProviderBaseUrlSubmit}\n providerBaseUrlCursorOffset={props.providerBaseUrlCursorOffset}\n setProviderBaseUrlCursorOffset={props.setProviderBaseUrlCursorOffset}\n />\n )\n }\n\n if (props.currentScreen === 'modelInput') {\n return (\n <ModelInputScreen\n theme={props.theme}\n exitState={props.exitState}\n terminalColumns={props.terminalColumns}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n selectedProvider={props.selectedProvider}\n customModelName={props.customModelName}\n setCustomModelName={props.setCustomModelName}\n handleCustomModelSubmit={props.handleCustomModelSubmit}\n customModelNameCursorOffset={props.customModelNameCursorOffset}\n setCustomModelNameCursorOffset={props.setCustomModelNameCursorOffset}\n />\n )\n }\n\n if (props.currentScreen === 'contextLength') {\n return (\n <ContextLengthScreen\n theme={props.theme}\n exitState={props.exitState}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n contextLength={props.contextLength}\n />\n )\n }\n\n if (props.currentScreen === 'connectionTest') {\n return (\n <ConnectionTestScreen\n theme={props.theme}\n exitState={props.exitState}\n terminalColumns={props.terminalColumns}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n selectedProvider={props.selectedProvider}\n getProviderLabel={props.getProviderLabel}\n isTestingConnection={props.isTestingConnection}\n connectionTestResult={props.connectionTestResult}\n />\n )\n }\n\n if (props.currentScreen === 'confirmation') {\n return (\n <ConfirmationScreen\n theme={props.theme}\n exitState={props.exitState}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n selectedProvider={props.selectedProvider}\n selectedModel={props.selectedModel}\n resourceName={props.resourceName}\n ollamaBaseUrl={props.ollamaBaseUrl}\n customBaseUrl={props.customBaseUrl}\n apiKey={props.apiKey}\n maxTokens={props.maxTokens}\n contextLength={props.contextLength}\n supportsReasoningEffort={props.supportsReasoningEffort}\n reasoningEffort={props.reasoningEffort}\n validationError={props.validationError}\n formatApiKeyDisplay={props.formatApiKeyDisplay}\n getProviderLabel={props.getProviderLabel}\n />\n )\n }\n\n if (props.currentScreen === 'partnerProviders') {\n return (\n <PartnerProvidersScreen\n theme={props.theme}\n exitState={props.exitState}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n partnerProviderOptions={props.partnerProviderOptions}\n partnerProviderFocusIndex={props.partnerProviderFocusIndex}\n partnerReservedLines={props.partnerReservedLines}\n getWindowedOptionsLayout={getWindowedOptionsLayout}\n renderWindowedOptions={renderWindowedOptions}\n />\n )\n }\n\n if (props.currentScreen === 'partnerCodingPlans') {\n return (\n <PartnerCodingPlansScreen\n theme={props.theme}\n exitState={props.exitState}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n tightLayout={props.tightLayout}\n compactLayout={props.compactLayout}\n codingPlanOptions={props.codingPlanOptions}\n codingPlanFocusIndex={props.codingPlanFocusIndex}\n codingReservedLines={props.codingReservedLines}\n getWindowedOptionsLayout={getWindowedOptionsLayout}\n renderWindowedOptions={renderWindowedOptions}\n />\n )\n }\n\n return (\n <ProviderSelectionScreen\n theme={props.theme}\n exitState={props.exitState}\n containerPaddingY={props.containerPaddingY}\n containerGap={props.containerGap}\n compactLayout={props.compactLayout}\n tightLayout={props.tightLayout}\n mainMenuOptions={props.mainMenuOptions}\n providerFocusIndex={props.providerFocusIndex}\n providerReservedLines={props.providerReservedLines}\n getWindowedOptionsLayout={getWindowedOptionsLayout}\n renderWindowedOptions={renderWindowedOptions}\n />\n )\n })()\n\n return (\n <Box flexDirection=\"column\" minHeight={minHeight}>\n {screen}\n </Box>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport TextInput from '#ui-ink/components/TextInput'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n terminalColumns: number\n compactLayout: boolean\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n selectedProvider: string\n apiKey: string\n cursorOffset: number\n handleApiKeyChange: (value: string) => void\n handleApiKeySubmit: (value: string) => void\n handleCursorOffsetChange: (offset: number) => void\n apiKeyCleanedNotification: boolean\n isLoadingModels: boolean\n providerBaseUrl: string\n modelLoadError: string | null\n formatApiKeyDisplay: (key: string) => string\n getProviderLabel: (provider: string, modelCount: number) => string\n}\n\nexport function ApiKeyScreen({\n theme,\n exitState,\n terminalColumns,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n selectedProvider,\n apiKey,\n cursorOffset,\n handleApiKeyChange,\n handleApiKeySubmit,\n handleCursorOffsetChange,\n apiKeyCleanedNotification,\n isLoadingModels,\n providerBaseUrl,\n modelLoadError,\n formatApiKeyDisplay,\n getProviderLabel,\n}: Props) {\n const modelTypeText = 'this model profile'\n const apiKeyInputColumns = Math.max(1, Math.min(80, terminalColumns - 10))\n const descriptionWidth = Math.max(1, Math.min(70, terminalColumns - 10))\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\n ' (',\n )[0]\n const skipsValidation =\n selectedProvider === 'minimax' || selectedProvider === 'minimax-coding'\n\n const providerHint = (() => {\n if (tightLayout) return null\n\n if (selectedProvider === 'kimi') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.moonshot.cn/console/api-keys\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'deepseek') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.deepseek.com/api_keys\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'siliconflow') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://cloud.siliconflow.cn/i/oJWsm6io\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'qwen') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://bailian.console.aliyun.com/?tab=model#/api-key\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'glm') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://open.bigmodel.cn (API Keys section)\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'glm-coding') {\n return (\n <Text color={theme.secondaryText}>\n Tip: This is for GLM Coding Plan API.{' '}\n <Text color={theme.suggestion}>\n Use the same API key as regular GLM\n </Text>\n <Newline />\n <Text dimColor>\n Note: This uses a special endpoint for coding tasks.\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'minimax') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://www.minimax.io/platform/user-center/basic-information\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'minimax-coding') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your Coding Plan API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.minimaxi.com/user-center/payment/coding-plan\n </Text>\n <Newline />\n <Text dimColor>\n Note: This requires a MiniMax Coding Plan subscription.\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'baidu-qianfan') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://console.bce.baidu.com/iam/#/iam/accesslist\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'openai') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.openai.com/api-keys\n </Text>\n </Text>\n )\n }\n if (selectedProvider === 'anthropic') {\n return (\n <Text color={theme.secondaryText}>\n Tip: Get your API key from your provider dashboard.\n </Text>\n )\n }\n\n return null\n })()\n\n return (\n <ScreenFrame\n title=\"API Key Setup\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>\n Enter your {providerDisplayName} API key for {modelTypeText}:\n </Text>\n\n <Box\n flexDirection=\"column\"\n width={tightLayout ? undefined : descriptionWidth}\n >\n {tightLayout ? (\n <Text color={theme.secondaryText}>\n Stored locally. Never sent to our servers.\n </Text>\n ) : (\n <>\n <Text color={theme.secondaryText}>\n {compactLayout\n ? `Stored locally and used to access ${selectedProvider}. Never sent to our servers.`\n : `This key will be stored locally and used to access the ${selectedProvider} API. Your key is never sent to our servers.`}\n </Text>\n {providerHint ? <Box marginTop={1}>{providerHint}</Box> : null}\n </>\n )}\n </Box>\n\n <Box flexDirection=\"column\">\n <TextInput\n placeholder=\"Paste your API key here...\"\n value={apiKey}\n displayValue={formatApiKeyDisplay(apiKey)}\n onChange={handleApiKeyChange}\n onSubmit={handleApiKeySubmit}\n mask=\"*\"\n columns={apiKeyInputColumns}\n maxHeight={1}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={handleCursorOffsetChange}\n showCursor={!isLoadingModels}\n focus={!isLoadingModels}\n />\n\n {apiKey && !tightLayout && (\n <Box marginTop={1}>\n <Text color={theme.secondaryText}>\n Key: {formatApiKeyDisplay(apiKey)} ({apiKey.length} chars)\n </Text>\n </Box>\n )}\n </Box>\n\n {apiKeyCleanedNotification && !tightLayout && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n \u2713 API key cleaned: trimmed whitespace\n </Text>\n </Box>\n )}\n\n {!tightLayout && (\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion} dimColor={!apiKey}>\n [Submit API Key]\n </Text>\n <Text>\n {' '}\n - Press Enter to{' '}\n {skipsValidation ? 'continue' : 'validate and continue'}\n </Text>\n </Text>\n </Box>\n )}\n\n {isLoadingModels && (\n <Box marginTop={tightLayout ? 0 : 1} flexDirection=\"column\">\n <Text color={theme.suggestion}>Validating API key\u2026</Text>\n {!tightLayout && modelLoadError ? (\n <Text dimColor>{modelLoadError}</Text>\n ) : null}\n {!tightLayout && providerBaseUrl ? (\n <Text dimColor>Endpoint: {providerBaseUrl}</Text>\n ) : null}\n </Box>\n )}\n\n {modelLoadError && !isLoadingModels && (\n <Box marginTop={tightLayout ? 0 : 1} flexDirection=\"column\">\n <Text color=\"red\">\n Validation failed{tightLayout ? `: ${modelLoadError}` : ''}\n </Text>\n {!tightLayout ? (\n <>\n <Text color=\"red\">{modelLoadError}</Text>\n <Text color={theme.warning}>\n Please check your API key and try again.\n </Text>\n </>\n ) : null}\n </Box>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue,{' '}\n <Text color={theme.suggestion}>Tab</Text> to{' '}\n {selectedProvider === 'anthropic' ||\n selectedProvider === 'kimi' ||\n selectedProvider === 'deepseek' ||\n selectedProvider === 'qwen' ||\n selectedProvider === 'glm' ||\n selectedProvider === 'glm-coding' ||\n selectedProvider === 'minimax' ||\n selectedProvider === 'minimax-coding' ||\n selectedProvider === 'baidu-qianfan' ||\n selectedProvider === 'siliconflow' ||\n selectedProvider === 'custom-openai'\n ? 'skip to manual model input'\n : 'skip using a key'}\n , or <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport { providers } from '#core/constants/models'\nimport TextInput from '#ui-ink/components/TextInput'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n terminalColumns: number\n compactLayout: boolean\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n selectedProvider: string\n isLoadingModels: boolean\n modelLoadError: string | null\n // custom-openai\n customBaseUrl: string\n setCustomBaseUrl: (value: string) => void\n handleCustomBaseUrlSubmit: (value: string) => void\n customBaseUrlCursorOffset: number\n setCustomBaseUrlCursorOffset: (value: number) => void\n // general provider base URL\n providerBaseUrl: string\n setProviderBaseUrl: (value: string) => void\n handleProviderBaseUrlSubmit: (value: string) => void\n providerBaseUrlCursorOffset: number\n setProviderBaseUrlCursorOffset: (value: number) => void\n}\n\nexport function BaseUrlScreen({\n theme,\n exitState,\n terminalColumns,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n selectedProvider,\n isLoadingModels,\n modelLoadError,\n customBaseUrl,\n setCustomBaseUrl,\n handleCustomBaseUrlSubmit,\n customBaseUrlCursorOffset,\n setCustomBaseUrlCursorOffset,\n providerBaseUrl,\n setProviderBaseUrl,\n handleProviderBaseUrlSubmit,\n providerBaseUrlCursorOffset,\n setProviderBaseUrlCursorOffset,\n}: Props) {\n const isCustomOpenAI = selectedProvider === 'custom-openai'\n const inputColumns = Math.max(1, Math.min(120, terminalColumns - 10))\n const descriptionWidth = Math.max(1, Math.min(70, terminalColumns - 10))\n\n // For custom-openai, we still use the old logic with customBaseUrl\n if (isCustomOpenAI) {\n return (\n <ScreenFrame\n title=\"Custom API Server Setup\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>Enter your custom API URL:</Text>\n {!tightLayout && (\n <Box flexDirection=\"column\" width={descriptionWidth}>\n <Text color={theme.secondaryText}>\n This is the base URL for your OpenAI-compatible API.\n <Newline />\n For example: https://api.example.com/v1\n </Text>\n </Box>\n )}\n\n <TextInput\n placeholder=\"https://api.example.com/v1\"\n value={customBaseUrl}\n onChange={setCustomBaseUrl}\n onSubmit={handleCustomBaseUrlSubmit}\n columns={inputColumns}\n cursorOffset={customBaseUrlCursorOffset}\n onChangeCursorOffset={setCustomBaseUrlCursorOffset}\n showCursor={!isLoadingModels}\n focus={!isLoadingModels}\n />\n\n {!tightLayout && (\n <Box marginTop={1}>\n <Text>\n <Text\n color={\n isLoadingModels ? theme.secondaryText : theme.suggestion\n }\n >\n [Submit Base URL]\n </Text>\n <Text> - Press Enter to continue</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n }\n\n // For all other providers, use the new general provider URL configuration\n const providerName = providers[selectedProvider]?.name || selectedProvider\n const defaultUrl = providers[selectedProvider]?.baseURL || ''\n\n return (\n <ScreenFrame\n title={`${providerName} API Configuration`}\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>Configure the API endpoint for {providerName}:</Text>\n {!tightLayout && (\n <Box flexDirection=\"column\" width={descriptionWidth}>\n <Text color={theme.secondaryText}>\n {selectedProvider === 'ollama' ? (\n <>\n This is the URL of your Ollama server.\n <Newline />\n Default is http://localhost:11434/v1 for local Ollama\n installations.\n </>\n ) : (\n <>\n This is the base URL for the {providerName} API.\n <Newline />\n You can modify this URL or press Enter to use the default.\n </>\n )}\n </Text>\n </Box>\n )}\n\n <TextInput\n placeholder={defaultUrl}\n value={providerBaseUrl}\n onChange={setProviderBaseUrl}\n onSubmit={handleProviderBaseUrlSubmit}\n columns={inputColumns}\n cursorOffset={providerBaseUrlCursorOffset}\n onChangeCursorOffset={setProviderBaseUrlCursorOffset}\n showCursor={!isLoadingModels}\n focus={!isLoadingModels}\n />\n\n {!tightLayout && (\n <Box marginTop={1}>\n <Text>\n <Text\n color={isLoadingModels ? theme.secondaryText : theme.suggestion}\n >\n [Submit Base URL]\n </Text>\n <Text> - Press Enter to continue</Text>\n </Text>\n </Box>\n )}\n\n {isLoadingModels && (\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text color={theme.success}>\n {selectedProvider === 'ollama'\n ? 'Connecting to Ollama server...'\n : `Connecting to ${providerName}...`}\n </Text>\n </Box>\n )}\n\n {modelLoadError && (\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text color=\"red\">Error: {modelLoadError}</Text>\n </Box>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\nimport { CONTEXT_LENGTH_OPTIONS } from '../options'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n compactLayout: boolean\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n selectedProvider: string\n selectedModel: string\n resourceName: string\n ollamaBaseUrl: string\n customBaseUrl: string\n apiKey: string\n maxTokens: string\n contextLength: number\n supportsReasoningEffort: boolean\n reasoningEffort: any\n validationError: string | null\n formatApiKeyDisplay: (key: string) => string\n getProviderLabel: (provider: string, modelCount: number) => string\n}\n\nexport function ConfirmationScreen({\n theme,\n exitState,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n selectedProvider,\n selectedModel,\n resourceName,\n ollamaBaseUrl,\n customBaseUrl,\n apiKey,\n maxTokens,\n contextLength,\n supportsReasoningEffort,\n reasoningEffort,\n validationError,\n formatApiKeyDisplay,\n getProviderLabel,\n}: Props) {\n // Show model profile being created\n\n // Get provider display name\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\n ' (',\n )[0]\n\n // Determine if provider requires API key\n const showsApiKey = selectedProvider !== 'ollama'\n\n return (\n <ScreenFrame\n title=\"Configuration Confirmation\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>Confirm your model configuration:</Text>\n {!tightLayout && (\n <Text color={theme.secondaryText}>\n Please review your selections before saving.\n </Text>\n )}\n\n {validationError && (\n <Box flexDirection=\"column\" marginTop={tightLayout ? 0 : 1}>\n <Text color={theme.error} bold>\n \u26A0 Configuration Error:\n </Text>\n <Text color={theme.error}>{validationError}</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={tightLayout ? 0 : 1}>\n <Text>\n <Text bold>Provider: </Text>\n <Text color={theme.suggestion}>{providerDisplayName}</Text>\n </Text>\n\n {selectedProvider === 'azure' && (\n <Text>\n <Text bold>Resource Name: </Text>\n <Text color={theme.suggestion}>{resourceName}</Text>\n </Text>\n )}\n\n {selectedProvider === 'ollama' && (\n <Text>\n <Text bold>Server URL: </Text>\n <Text color={theme.suggestion}>{ollamaBaseUrl}</Text>\n </Text>\n )}\n\n {selectedProvider === 'custom-openai' && !tightLayout && (\n <Text>\n <Text bold>API Base URL: </Text>\n <Text color={theme.suggestion}>{customBaseUrl}</Text>\n </Text>\n )}\n\n <Text>\n <Text bold>Model: </Text>\n <Text color={theme.suggestion}>{selectedModel}</Text>\n </Text>\n\n {showsApiKey && (\n <Text>\n <Text bold>API Key: </Text>\n <Text color={theme.suggestion}>\n {apiKey\n ? tightLayout\n ? '(set)'\n : formatApiKeyDisplay(apiKey)\n : '(none)'}\n </Text>\n </Text>\n )}\n\n {!tightLayout && maxTokens && (\n <Text>\n <Text bold>Max Tokens: </Text>\n <Text color={theme.suggestion}>{maxTokens}</Text>\n </Text>\n )}\n\n <Text>\n <Text bold>Context Length: </Text>\n <Text color={theme.suggestion}>\n {CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength)\n ?.label || `${contextLength.toLocaleString()} tokens`}\n </Text>\n </Text>\n\n {!tightLayout && supportsReasoningEffort && (\n <Text>\n <Text bold>Reasoning Effort: </Text>\n <Text color={theme.suggestion}>{reasoningEffort}</Text>\n </Text>\n )}\n\n {compactLayout && tightLayout && maxTokens && (\n <Text dimColor>Max Tokens: {maxTokens}</Text>\n )}\n </Box>\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back or{' '}\n <Text color={theme.suggestion}>Enter</Text> to save configuration\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "export type ReasoningEffortOption = 'low' | 'medium' | 'high'\n\nexport type RequestStrategyOption =\n | 'auto'\n | 'kode'\n | 'compat_headers'\n | 'compat_headers_system'\n | 'compat_full'\n\nexport const REQUEST_STRATEGY_OPTIONS: Array<{\n label: string\n value: RequestStrategyOption\n}> = [\n { label: 'Auto (recommended)', value: 'auto' },\n { label: 'Kode default only', value: 'kode' },\n { label: 'Compatibility headers only', value: 'compat_headers' },\n {\n label: 'Compatibility headers + system prompt',\n value: 'compat_headers_system',\n },\n {\n label: 'Compatibility headers + system prompt + baseline tools',\n value: 'compat_full',\n },\n]\n\nexport const REASONING_EFFORT_OPTIONS: Array<{\n label: string\n value: ReasoningEffortOption\n}> = [\n { label: 'Low - Faster responses, less thorough reasoning', value: 'low' },\n { label: 'Medium - Balanced speed and reasoning depth', value: 'medium' },\n {\n label: 'High - Slower responses, more thorough reasoning',\n value: 'high',\n },\n]\n\nexport type ContextLengthOption = {\n label: string\n value: number\n}\n\nexport const CONTEXT_LENGTH_OPTIONS: ContextLengthOption[] = [\n { label: '32K tokens', value: 32000 },\n { label: '64K tokens', value: 64000 },\n { label: '128K tokens', value: 128000 },\n { label: '200K tokens', value: 200000 },\n { label: '256K tokens', value: 256000 },\n { label: '300K tokens', value: 300000 },\n { label: '512K tokens', value: 512000 },\n { label: '1000K tokens', value: 1000000 },\n { label: '2000K tokens', value: 2000000 },\n { label: '3000K tokens', value: 3000000 },\n { label: '5000K tokens', value: 5000000 },\n { label: '10000K tokens', value: 10000000 },\n]\n\nexport const DEFAULT_CONTEXT_LENGTH = 128000\n\nexport type MaxTokensOption = {\n label: string\n value: number\n}\n\nexport const MAX_TOKENS_OPTIONS: MaxTokensOption[] = [\n { label: '1K tokens', value: 1024 },\n { label: '2K tokens', value: 2048 },\n { label: '4K tokens', value: 4096 },\n { label: '8K tokens (recommended)', value: 8192 },\n { label: '16K tokens', value: 16384 },\n { label: '32K tokens', value: 32768 },\n { label: '64K tokens', value: 65536 },\n { label: '128K tokens', value: 131072 },\n]\n\nexport const DEFAULT_MAX_TOKENS = 8192\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\nimport type { ConnectionTestResult } from '../actions/connectionTest'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\nfunction formatStrategyLabel(value?: string): string | null {\n if (!value) return null\n switch (value) {\n case 'kode-default':\n return 'Kode default'\n case 'compat-headers':\n return 'Compatibility headers'\n case 'compat-headers-system':\n return 'Compatibility headers + prompt'\n case 'compat-full':\n return 'Compatibility full'\n default:\n return value\n }\n}\n\nfunction formatErrorCategory(value?: string): string | null {\n if (!value) return null\n switch (value) {\n case 'restricted_client_only':\n return 'Provider restricts third-party clients for this model'\n case 'auth':\n return 'Authentication error'\n case 'billing':\n return 'Billing / quota error'\n case 'network':\n return 'Network error'\n case 'timeout':\n return 'Request timed out'\n case 'tool_use_unsupported':\n return 'Tool use unsupported'\n case 'unexpected_tool_call':\n return 'Unexpected tool call'\n case 'invalid_tool_args':\n return 'Invalid tool arguments'\n case 'local_verification_failed':\n return 'Local verification failed'\n case 'other':\n return 'Other error'\n default:\n return value\n }\n}\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n terminalColumns: number\n compactLayout: boolean\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n selectedProvider: string\n getProviderLabel: (provider: string, modelCount: number) => string\n isTestingConnection: boolean\n connectionTestResult: ConnectionTestResult | null\n}\n\nexport function ConnectionTestScreen({\n theme,\n exitState,\n terminalColumns,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n selectedProvider,\n getProviderLabel,\n isTestingConnection,\n connectionTestResult,\n}: Props) {\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\n ' (',\n )[0]\n const descriptionWidth = Math.max(1, Math.min(70, terminalColumns - 10))\n\n return (\n <ScreenFrame\n title=\"Connection Test\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>Testing connection to {providerDisplayName}...</Text>\n {!tightLayout && (\n <Box flexDirection=\"column\" width={descriptionWidth}>\n <Text color={theme.secondaryText}>\n This will verify your configuration by sending a test request to\n the API.\n {selectedProvider === 'minimax' && (\n <>\n <Newline />\n For MiniMax, we'll test both v2 and v1 endpoints to find the\n best one.\n </>\n )}\n </Text>\n </Box>\n )}\n\n {!connectionTestResult && !isTestingConnection && (\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text>\n <Text color={theme.suggestion}>Press Enter</Text> to start the\n connection test\n </Text>\n </Box>\n )}\n\n {isTestingConnection && (\n <Box\n flexDirection=\"column\"\n marginTop={tightLayout ? 0 : 1}\n gap={containerGap}\n >\n <Text color={theme.suggestion}>\n {tightLayout ? 'Testing connection\u2026' : '\uD83D\uDD04 Testing connection...'}\n </Text>\n {connectionTestResult?.message && (\n <Text color={theme.secondaryText}>\n {connectionTestResult.message}\n </Text>\n )}\n {!tightLayout &&\n (connectionTestResult?.attempt ||\n connectionTestResult?.phase) && (\n <Text color={theme.secondaryText}>\n {connectionTestResult.phase\n ? `Phase: ${connectionTestResult.phase}`\n : null}\n {connectionTestResult.attempt\n ? ` \u00B7 Attempt: ${connectionTestResult.attempt}/${connectionTestResult.maxAttempts ?? '?'}`\n : ''}\n {connectionTestResult.fallbackStep\n ? ` \u00B7 Strategy: ${formatStrategyLabel(connectionTestResult.fallbackStep)}`\n : ''}\n </Text>\n )}\n {!tightLayout &&\n typeof connectionTestResult?.retryInMs === 'number' && (\n <Text color={theme.secondaryText}>\n Retrying in{' '}\n {Math.round(connectionTestResult.retryInMs / 1000)}s...\n </Text>\n )}\n </Box>\n )}\n\n {connectionTestResult && !isTestingConnection && (\n <Box\n flexDirection=\"column\"\n marginTop={tightLayout ? 0 : 1}\n gap={containerGap}\n >\n <Text color={connectionTestResult.success ? theme.success : 'red'}>\n {connectionTestResult.message}\n </Text>\n\n {!tightLayout && connectionTestResult.endpoint && (\n <Text color={theme.secondaryText}>\n Endpoint: {connectionTestResult.endpoint}\n </Text>\n )}\n\n {!tightLayout && connectionTestResult.fallbackStep && (\n <Text color={theme.secondaryText}>\n Strategy:{' '}\n {formatStrategyLabel(connectionTestResult.fallbackStep)}\n </Text>\n )}\n\n {!tightLayout && connectionTestResult.errorCategory && (\n <Text color={theme.secondaryText}>\n Error type:{' '}\n {formatErrorCategory(connectionTestResult.errorCategory)}\n </Text>\n )}\n\n {!tightLayout && connectionTestResult.details && (\n <Text color={theme.secondaryText}>\n Details: {connectionTestResult.details}\n </Text>\n )}\n\n {connectionTestResult.success ? (\n !tightLayout && (\n <Text color={theme.success}>\n Automatically proceeding...\n </Text>\n )\n ) : (\n <Text>\n <Text color={theme.suggestion}>Press Enter</Text> to retry, or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n )}\n </Box>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\n context length\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\nimport { CONTEXT_LENGTH_OPTIONS, DEFAULT_CONTEXT_LENGTH } from '../options'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n compactLayout: boolean\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n contextLength: number\n}\n\nexport function ContextLengthScreen({\n theme,\n exitState,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n contextLength,\n}: Props) {\n const selectedOption =\n CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength) ||\n CONTEXT_LENGTH_OPTIONS[2] // Default to 128K\n\n return (\n <ScreenFrame\n title=\"Context Length Configuration\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>Choose the context window length for your model:</Text>\n {!tightLayout && (\n <Text color={theme.secondaryText}>\n {compactLayout\n ? 'Controls how much history the model can process.'\n : 'This determines how much conversation history and context the model can process at once. Higher values allow for longer conversations but may increase costs.'}\n </Text>\n )}\n\n <Box flexDirection=\"column\" marginY={tightLayout ? 0 : 1}>\n {CONTEXT_LENGTH_OPTIONS.map(option => {\n const isSelected = option.value === contextLength\n return (\n <Box key={option.value} flexDirection=\"row\">\n <Text color={isSelected ? 'blue' : undefined}>\n {isSelected ? '\u2192 ' : ' '}\n {option.label}\n {option.value === DEFAULT_CONTEXT_LENGTH\n ? ' (recommended)'\n : ''}\n </Text>\n </Box>\n )\n })}\n </Box>\n\n {!tightLayout && (\n <Text dimColor>\n Selected:{' '}\n <Text color={theme.suggestion}>{selectedOption.label}</Text>\n </Text>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n \u2191/\u2193 to select \u00B7 Enter to continue \u00B7 Esc to go back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport TextInput from '#ui-ink/components/TextInput'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n terminalColumns: number\n compactLayout: boolean\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n selectedProvider: string\n customModelName: string\n setCustomModelName: (value: string) => void\n handleCustomModelSubmit: (value: string) => void\n customModelNameCursorOffset: number\n setCustomModelNameCursorOffset: (value: number) => void\n}\n\nexport function ModelInputScreen({\n theme,\n exitState,\n terminalColumns,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n selectedProvider,\n customModelName,\n setCustomModelName,\n handleCustomModelSubmit,\n customModelNameCursorOffset,\n setCustomModelNameCursorOffset,\n}: Props) {\n const modelTypeText = 'this model profile'\n const descriptionWidth = Math.max(1, Math.min(70, terminalColumns - 10))\n const inputColumns = Math.max(1, Math.min(100, terminalColumns - 10))\n\n // Determine the screen title and description based on provider\n let screenTitle = 'Manual Model Setup'\n let description = 'Enter the model name manually'\n let placeholder = 'gpt-4'\n let examples = 'For example: \"gpt-4\", \"gpt-3.5-turbo\", etc.'\n\n if (selectedProvider === 'azure') {\n screenTitle = 'Azure Model Setup'\n description = `Enter your Azure OpenAI deployment name for ${modelTypeText}:`\n examples = 'For example: \"gpt-4\", \"gpt-35-turbo\", etc.'\n placeholder = 'gpt-4'\n } else if (selectedProvider === 'anthropic') {\n screenTitle = 'Model Setup'\n description = `Enter the model name for ${modelTypeText}:`\n examples =\n 'For example: \"claude-3-5-sonnet-latest\", \"claude-3-5-haiku-latest\", etc.'\n placeholder = 'claude-3-5-sonnet-latest'\n } else if (selectedProvider === 'bigdream') {\n screenTitle = 'BigDream Model Setup'\n description = `Enter the BigDream model name for ${modelTypeText}:`\n examples =\n 'For example: \"claude-3-5-sonnet-latest\", \"claude-3-5-haiku-latest\", etc.'\n placeholder = 'claude-3-5-sonnet-latest'\n } else if (selectedProvider === 'kimi') {\n screenTitle = 'Kimi Model Setup'\n description = `Enter the Kimi model name for ${modelTypeText}:`\n examples = 'For example: \"kimi-k2-0711-preview\"'\n placeholder = 'kimi-k2-0711-preview'\n } else if (selectedProvider === 'deepseek') {\n screenTitle = 'DeepSeek Model Setup'\n description = `Enter the DeepSeek model name for ${modelTypeText}:`\n examples =\n 'For example: \"deepseek-chat\", \"deepseek-coder\", \"deepseek-reasoner\", etc.'\n placeholder = 'deepseek-chat'\n } else if (selectedProvider === 'siliconflow') {\n screenTitle = 'SiliconFlow Model Setup'\n description = `Enter the SiliconFlow model name for ${modelTypeText}:`\n examples =\n 'For example: \"Qwen/Qwen2.5-72B-Instruct\", \"meta-llama/Meta-Llama-3.1-8B-Instruct\", etc.'\n placeholder = 'Qwen/Qwen2.5-72B-Instruct'\n } else if (selectedProvider === 'qwen') {\n screenTitle = 'Qwen Model Setup'\n description = `Enter the Qwen model name for ${modelTypeText}:`\n examples = 'For example: \"qwen-plus\", \"qwen-turbo\", \"qwen-max\", etc.'\n placeholder = 'qwen-plus'\n } else if (selectedProvider === 'glm') {\n screenTitle = 'GLM Model Setup'\n description = `Enter the GLM model name for ${modelTypeText}:`\n examples = 'For example: \"glm-4\", \"glm-4v\", \"glm-3-turbo\", etc.'\n placeholder = 'glm-4'\n } else if (selectedProvider === 'glm-coding') {\n screenTitle = 'GLM Coding Plan Model Setup'\n description = `Enter the GLM model name for ${modelTypeText}:`\n examples = 'For Coding Plan, typically use: \"GLM-4.6\" or other GLM models'\n placeholder = 'GLM-4.6'\n } else if (selectedProvider === 'minimax') {\n screenTitle = 'MiniMax Model Setup'\n description = `Enter the MiniMax model name for ${modelTypeText}:`\n examples =\n 'For example: \"abab6.5s-chat\", \"abab6.5g-chat\", \"abab5.5s-chat\", etc.'\n placeholder = 'abab6.5s-chat'\n } else if (selectedProvider === 'minimax-coding') {\n screenTitle = 'MiniMax Coding Plan Model Setup'\n description = `Enter the MiniMax model name for ${modelTypeText}:`\n examples = 'For Coding Plan, use: \"MiniMax-M2\"'\n placeholder = 'MiniMax-M2'\n } else if (selectedProvider === 'baidu-qianfan') {\n screenTitle = 'Baidu Qianfan Model Setup'\n description = `Enter the Baidu Qianfan model name for ${modelTypeText}:`\n examples =\n 'For example: \"ERNIE-4.0-8K\", \"ERNIE-3.5-8K\", \"ERNIE-Speed-128K\", etc.'\n placeholder = 'ERNIE-4.0-8K'\n } else if (selectedProvider === 'custom-openai') {\n screenTitle = 'Custom API Model Setup'\n description = `Enter the model name for ${modelTypeText}:`\n examples = 'Enter the exact model name as supported by your API endpoint.'\n placeholder = 'model-name'\n }\n\n return (\n <ScreenFrame\n title={screenTitle}\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>{description}</Text>\n\n {!tightLayout && (\n <Box flexDirection=\"column\" width={descriptionWidth}>\n <Text color={theme.secondaryText}>\n {selectedProvider === 'azure'\n ? 'This is the deployment name you configured in your Azure OpenAI resource.'\n : selectedProvider === 'anthropic'\n ? 'This should match a model identifier supported by your API endpoint.'\n : selectedProvider === 'bigdream'\n ? 'This should be a valid model identifier supported by BigDream.'\n : selectedProvider === 'kimi'\n ? 'This should be a valid Kimi model identifier from Moonshot AI.'\n : selectedProvider === 'deepseek'\n ? 'This should be a valid DeepSeek model identifier.'\n : selectedProvider === 'siliconflow'\n ? 'This should be a valid SiliconFlow model identifier.'\n : selectedProvider === 'qwen'\n ? 'This should be a valid Qwen model identifier from Alibaba Cloud.'\n : selectedProvider === 'glm'\n ? 'This should be a valid GLM model identifier from Zhipu AI.'\n : selectedProvider === 'minimax'\n ? 'This should be a valid MiniMax model identifier.'\n : selectedProvider === 'baidu-qianfan'\n ? 'This should be a valid Baidu Qianfan model identifier.'\n : 'This should match the model name supported by your API endpoint.'}\n <Newline />\n {compactLayout ? examples.split(',')[0] : examples}\n </Text>\n </Box>\n )}\n\n <TextInput\n placeholder={placeholder}\n value={customModelName}\n onChange={setCustomModelName}\n onSubmit={handleCustomModelSubmit}\n columns={inputColumns}\n cursorOffset={customModelNameCursorOffset}\n onChangeCursorOffset={setCustomModelNameCursorOffset}\n showCursor={true}\n />\n\n {!tightLayout && (\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion} dimColor={!customModelName}>\n [Submit Model Name]\n </Text>\n <Text> - Press Enter to continue</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\nimport {\n type ReasoningEffortOption,\n type RequestStrategyOption,\n MAX_TOKENS_OPTIONS,\n} from '../options'\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 1\n\nfunction isReasoningEffortOption(\n value: string,\n): value is ReasoningEffortOption {\n return value === 'low' || value === 'medium' || value === 'high'\n}\n\ntype Field = {\n name: string\n label: string\n description?: string\n component: 'select' | 'button'\n options?: Array<{ label: string; value: string }>\n defaultValue?: string\n}\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n terminalRows: number\n compactLayout: boolean\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n selectedModel: string\n formFields: Field[]\n activeFieldIndex: number\n setActiveFieldIndex: (value: number | ((current: number) => number)) => void\n maxTokens: string\n setMaxTokens: (value: string) => void\n setSelectedMaxTokensPreset: (value: number) => void\n setMaxTokensCursorOffset: (value: number) => void\n reasoningEffortOptions: Array<{ label: string; value: ReasoningEffortOption }>\n reasoningEffort: ReasoningEffortOption | null\n setReasoningEffort: (value: ReasoningEffortOption | null) => void\n requestStrategyOptions: Array<{\n label: string\n value: RequestStrategyOption\n }>\n requestStrategy: RequestStrategyOption\n setRequestStrategy: (value: RequestStrategyOption) => void\n}\n\nexport function ModelParamsScreen({\n theme,\n exitState,\n terminalRows,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n selectedModel,\n formFields,\n activeFieldIndex,\n setActiveFieldIndex,\n maxTokens,\n setMaxTokens,\n setSelectedMaxTokensPreset,\n setMaxTokensCursorOffset,\n reasoningEffortOptions,\n reasoningEffort,\n setReasoningEffort,\n requestStrategyOptions,\n requestStrategy,\n setRequestStrategy,\n}: Props) {\n const maxSelectHeight = Math.max(\n 3,\n Math.min(\n tightLayout ? 6 : 10,\n terminalRows - (tightLayout ? 12 : 18) - VIEWPORT_SAFE_MARGIN_ROWS,\n ),\n )\n\n return (\n <ScreenFrame\n title=\"Model Parameters\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>Configure parameters for {selectedModel}:</Text>\n {!tightLayout && (\n <Text color={theme.secondaryText}>\n {compactLayout\n ? 'Tab: next field \u00B7 Enter: continue'\n : 'Use Tab to navigate between fields. Press Enter to continue.'}\n </Text>\n )}\n\n <Box flexDirection=\"column\">\n {formFields.map((field, index) => (\n <Box\n flexDirection=\"column\"\n marginY={tightLayout ? 0 : 1}\n key={field.name}\n >\n <Text\n bold\n color={activeFieldIndex === index ? theme.success : undefined}\n >\n {field.label}\n </Text>\n {!tightLayout &&\n field.component !== 'button' &&\n field.description ? (\n <Text color={theme.secondaryText}>{field.description}</Text>\n ) : null}\n\n <Box marginY={tightLayout ? 0 : 1}>\n {activeFieldIndex === index ? (\n field.component === 'select' ? (\n field.name === 'maxTokens' ? (\n <Select\n options={field.options || []}\n onChange={value => {\n const numValue = parseInt(value)\n setMaxTokens(numValue.toString())\n setSelectedMaxTokensPreset(numValue)\n setMaxTokensCursorOffset(numValue.toString().length)\n setTimeout(() => {\n setActiveFieldIndex(current =>\n Math.min(current + 1, formFields.length - 1),\n )\n }, 100)\n }}\n defaultValue={field.defaultValue}\n visibleOptionCount={Math.min(10, maxSelectHeight)}\n />\n ) : field.name === 'reasoningEffort' ? (\n <Select\n options={reasoningEffortOptions}\n onChange={value => {\n if (isReasoningEffortOption(value)) {\n setReasoningEffort(value)\n }\n setTimeout(() => {\n setActiveFieldIndex(current =>\n Math.min(current + 1, formFields.length - 1),\n )\n }, 100)\n }}\n defaultValue={reasoningEffort ?? undefined}\n visibleOptionCount={Math.min(8, maxSelectHeight)}\n />\n ) : field.name === 'requestStrategy' ? (\n <Select\n options={requestStrategyOptions}\n onChange={value => {\n setRequestStrategy(value as RequestStrategyOption)\n setTimeout(() => {\n setActiveFieldIndex(current =>\n Math.min(current + 1, formFields.length - 1),\n )\n }, 100)\n }}\n defaultValue={requestStrategy}\n visibleOptionCount={Math.min(6, maxSelectHeight)}\n />\n ) : null\n ) : null\n ) : field.name === 'maxTokens' ? (\n <Text color={theme.secondaryText}>\n Current:{' '}\n <Text color={theme.suggestion}>\n {MAX_TOKENS_OPTIONS.find(\n opt => opt.value === parseInt(maxTokens),\n )?.label || `${maxTokens} tokens`}\n </Text>\n </Text>\n ) : field.name === 'reasoningEffort' ? (\n <Text color={theme.secondaryText}>\n Current:{' '}\n <Text color={theme.suggestion}>{reasoningEffort}</Text>\n </Text>\n ) : field.name === 'requestStrategy' ? (\n <Text color={theme.secondaryText}>\n Current:{' '}\n <Text color={theme.suggestion}>\n {requestStrategyOptions.find(\n option => option.value === requestStrategy,\n )?.label ?? requestStrategy}\n </Text>\n </Text>\n ) : null}\n </Box>\n </Box>\n ))}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>Tab: next \u00B7 Enter: continue \u00B7 Esc: back</Text>\n </Box>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\n\nimport { Select } from '#ui-ink/components/CustomSelect/select'\nimport TextInput from '#ui-ink/components/TextInput'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\nimport type { ModelInfo } from '../types'\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n terminalRows: number\n terminalColumns: number\n compactLayout: boolean\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n selectedProvider: string\n availableModels: ModelInfo[]\n modelSearchQuery: string\n modelSearchCursorOffset: number\n handleModelSearchChange: (value: string) => void\n handleModelSearchCursorOffsetChange: (offset: number) => void\n modelOptions: Array<{ label: string; value: string }>\n handleModelSelection: (value: string) => void\n getProviderLabel: (provider: string, modelCount: number) => string\n}\n\nconst VIEWPORT_SAFE_MARGIN_ROWS = 2\n\nexport function ModelSelectionScreen({\n theme,\n exitState,\n terminalRows,\n terminalColumns,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n selectedProvider,\n availableModels,\n modelSearchQuery,\n modelSearchCursorOffset,\n handleModelSearchChange,\n handleModelSearchCursorOffsetChange,\n modelOptions,\n handleModelSelection,\n getProviderLabel,\n}: Props) {\n const modelTypeText = 'this model profile'\n const descriptionWidth = Math.max(1, Math.min(70, terminalColumns - 10))\n const inputColumns = Math.max(1, Math.min(80, terminalColumns - 10))\n\n const reservedLines =\n (tightLayout ? 10 : compactLayout ? 12 : 14) +\n containerPaddingY * 2 +\n containerGap * 4\n const availableForList = Math.max(\n 3,\n terminalRows - reservedLines - 1 - VIEWPORT_SAFE_MARGIN_ROWS,\n )\n const visibleOptionCount = Math.max(\n 3,\n Math.min(12, modelOptions.length || 12, availableForList),\n )\n const listMinHeight = visibleOptionCount\n\n return (\n <ScreenFrame\n title=\"Model Selection\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold wrap=\"truncate-end\">\n Select a model from{' '}\n {\n getProviderLabel(selectedProvider, availableModels.length).split(\n ' (',\n )[0]\n }{' '}\n for {modelTypeText}:\n </Text>\n {!tightLayout && (\n <Box flexDirection=\"column\" width={descriptionWidth}>\n <Text color={theme.secondaryText}>\n {compactLayout\n ? 'Pick a model for this profile.'\n : 'This profile can be assigned to pointers (main, task, compact, quick) for different use cases.'}\n </Text>\n </Box>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n {!tightLayout && <Text bold>Search models:</Text>}\n <TextInput\n placeholder=\"Type to filter models...\"\n value={modelSearchQuery}\n onChange={handleModelSearchChange}\n columns={inputColumns}\n cursorOffset={modelSearchCursorOffset}\n onChangeCursorOffset={handleModelSearchCursorOffsetChange}\n showCursor={true}\n focus={true}\n />\n </Box>\n\n <Box flexDirection=\"column\" minHeight={listMinHeight}>\n {modelOptions.length > 0 ? (\n <Select\n options={modelOptions}\n onChange={handleModelSelection}\n visibleOptionCount={visibleOptionCount}\n />\n ) : availableModels.length > 0 ? (\n <Text color=\"yellow\">\n No models match your search. Try a different query.\n </Text>\n ) : (\n <Text color=\"yellow\">No models available for this provider.</Text>\n )}\n </Box>\n {!tightLayout && modelOptions.length > 0 && (\n <Text dimColor>\n Showing {modelOptions.length} of {availableModels.length} models\n </Text>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n Press <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Option = { value: string; label: string }\ntype WindowedOptionsLayout = {\n visibleOptionCount: number\n showIndicators: boolean\n}\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n containerPaddingY: number\n containerGap: number\n tightLayout: boolean\n compactLayout: boolean\n codingPlanOptions: Option[]\n codingPlanFocusIndex: number\n codingReservedLines: number\n getWindowedOptionsLayout: (\n requestedCount: number,\n optionLength: number,\n reservedLines?: number,\n ) => WindowedOptionsLayout\n renderWindowedOptions: (\n options: Option[],\n focusedIndex: number,\n layout: WindowedOptionsLayout,\n ) => React.ReactNode\n}\n\nexport function PartnerCodingPlansScreen({\n theme,\n exitState,\n containerPaddingY,\n containerGap,\n tightLayout,\n compactLayout,\n codingPlanOptions,\n codingPlanFocusIndex,\n codingReservedLines,\n getWindowedOptionsLayout,\n renderWindowedOptions,\n}: Props) {\n const footerMarginTop = tightLayout ? 0 : 1\n return (\n <ScreenFrame\n title=\"Some Coding Plans\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold wrap=\"truncate-end\">\n Select a partner coding plan for specialized programming assistance:\n </Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {compactLayout ? (\n 'Specialized coding models from partners.'\n ) : (\n <>\n These are specialized models optimized for coding and\n development tasks.\n <Newline />\n They require specific coding plan subscriptions from the\n respective providers.\n </>\n )}\n </Text>\n </Box>\n\n {renderWindowedOptions(\n codingPlanOptions,\n codingPlanFocusIndex,\n getWindowedOptionsLayout(\n 5,\n codingPlanOptions.length,\n codingReservedLines,\n ),\n )}\n\n <Box marginTop={footerMarginTop}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 or j/k \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Enter confirm \u00B7 Esc back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Text } from 'ink'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Option = { value: string; label: string }\ntype WindowedOptionsLayout = {\n visibleOptionCount: number\n showIndicators: boolean\n}\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n containerPaddingY: number\n containerGap: number\n compactLayout: boolean\n tightLayout: boolean\n partnerProviderOptions: Option[]\n partnerProviderFocusIndex: number\n partnerReservedLines: number\n getWindowedOptionsLayout: (\n requestedCount: number,\n optionLength: number,\n reservedLines?: number,\n ) => WindowedOptionsLayout\n renderWindowedOptions: (\n options: Option[],\n focusedIndex: number,\n layout: WindowedOptionsLayout,\n ) => React.ReactNode\n}\n\nexport function PartnerProvidersScreen({\n theme,\n exitState,\n containerPaddingY,\n containerGap,\n compactLayout,\n tightLayout,\n partnerProviderOptions,\n partnerProviderFocusIndex,\n partnerReservedLines,\n getWindowedOptionsLayout,\n renderWindowedOptions,\n}: Props) {\n const footerMarginTop = tightLayout ? 0 : 1\n return (\n <ScreenFrame\n title=\"Other Providers\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold wrap=\"truncate-end\">\n Select a partner AI provider for this model profile:\n </Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {compactLayout\n ? 'Choose an official partner provider.'\n : 'Choose from official partner providers to access their models and services.'}\n </Text>\n </Box>\n\n {renderWindowedOptions(\n partnerProviderOptions,\n partnerProviderFocusIndex,\n getWindowedOptionsLayout(\n 6,\n partnerProviderOptions.length,\n partnerReservedLines,\n ),\n )}\n\n <Box marginTop={footerMarginTop}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 or j/k \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Enter confirm \u00B7 Esc back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Option = { value: string; label: string }\ntype WindowedOptionsLayout = {\n visibleOptionCount: number\n showIndicators: boolean\n}\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n containerPaddingY: number\n containerGap: number\n compactLayout: boolean\n tightLayout: boolean\n mainMenuOptions: Option[]\n providerFocusIndex: number\n providerReservedLines: number\n getWindowedOptionsLayout: (\n requestedCount: number,\n optionLength: number,\n reservedLines?: number,\n ) => WindowedOptionsLayout\n renderWindowedOptions: (\n options: Option[],\n focusedIndex: number,\n layout: WindowedOptionsLayout,\n ) => React.ReactNode\n}\n\nexport function ProviderSelectionScreen({\n theme,\n exitState,\n containerPaddingY,\n containerGap,\n compactLayout,\n tightLayout,\n mainMenuOptions,\n providerFocusIndex,\n providerReservedLines,\n getWindowedOptionsLayout,\n renderWindowedOptions,\n}: Props) {\n return (\n <ScreenFrame\n title=\"Provider Selection\"\n exitState={exitState}\n paddingX={tightLayout || compactLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold wrap=\"truncate-end\">\n Select your preferred AI provider for this model profile:\n </Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text color={theme.secondaryText} wrap=\"truncate-end\">\n {compactLayout ? (\n 'Choose the provider to use for this profile.'\n ) : (\n <>\n Choose the provider you want to use for this model profile.\n <Newline />\n This will determine which models are available to you.\n </>\n )}\n </Text>\n </Box>\n\n {renderWindowedOptions(\n mainMenuOptions,\n providerFocusIndex,\n getWindowedOptionsLayout(\n 5,\n mainMenuOptions.length,\n providerReservedLines,\n ),\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor wrap=\"truncate-end\">\n \u2191/\u2193 or j/k \u00B7 PgUp/PgDn \u00B7 Home/End \u00B7 Enter confirm \u00B7 Esc exit \u00B7{' '}\n <Text color={theme.suggestion}>/model</Text>\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import React from 'react'\nimport { Box, Newline, Text } from 'ink'\n\nimport TextInput from '#ui-ink/components/TextInput'\nimport {\n ScreenFrame,\n type ScreenExitState,\n} from '#ui-ink/primitives/layout/ScreenFrame'\n\ntype Props = {\n theme: any\n exitState: ScreenExitState\n terminalColumns: number\n tightLayout: boolean\n containerPaddingY: number\n containerGap: number\n resourceName: string\n setResourceName: (value: string) => void\n handleResourceNameSubmit: (value: string) => void\n resourceNameCursorOffset: number\n setResourceNameCursorOffset: (value: number) => void\n}\n\nexport function ResourceNameScreen({\n theme,\n exitState,\n terminalColumns,\n tightLayout,\n containerPaddingY,\n containerGap,\n resourceName,\n setResourceName,\n handleResourceNameSubmit,\n resourceNameCursorOffset,\n setResourceNameCursorOffset,\n}: Props) {\n const inputColumns = Math.max(1, Math.min(80, terminalColumns - 10))\n const descriptionWidth = Math.max(1, Math.min(70, terminalColumns - 10))\n\n return (\n <ScreenFrame\n title=\"Azure Resource Setup\"\n exitState={exitState}\n paddingX={tightLayout ? 1 : 2}\n paddingY={containerPaddingY}\n gap={containerGap}\n >\n <Box flexDirection=\"column\" gap={containerGap}>\n <Text bold>Enter your Azure OpenAI resource name:</Text>\n {!tightLayout && (\n <Box flexDirection=\"column\" width={descriptionWidth}>\n <Text color={theme.secondaryText}>\n This is the name of your Azure OpenAI resource (without the full\n domain).\n <Newline />\n For example, if your endpoint is\n \"https://myresource.openai.azure.com\", enter \"myresource\".\n </Text>\n </Box>\n )}\n\n <TextInput\n placeholder=\"myazureresource\"\n value={resourceName}\n onChange={setResourceName}\n onSubmit={handleResourceNameSubmit}\n columns={inputColumns}\n cursorOffset={resourceNameCursorOffset}\n onChangeCursorOffset={setResourceNameCursorOffset}\n showCursor={true}\n />\n\n {!tightLayout && (\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion} dimColor={!resourceName}>\n [Submit Resource Name]\n </Text>\n <Text> - Press Enter to continue</Text>\n </Text>\n </Box>\n )}\n\n <Box marginTop={tightLayout ? 0 : 1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </ScreenFrame>\n )\n}\n", "import { useEffect, useMemo } from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { useExitOnCtrlCD } from '#ui-ink/hooks/useExitOnCtrlCD'\nimport { useScreenLayout } from '#ui-ink/primitives/layout/useScreenLayout'\nimport { CONTEXT_LENGTH_OPTIONS, DEFAULT_CONTEXT_LENGTH } from './flow/options'\nimport { printModelConfig } from './flow/printModelConfig'\nimport type { ModelSelectorProps } from './types'\nimport type { ModelSelectorViewProps } from './viewTypes'\nimport { useModelSelectorInput } from './useModelSelectorInput'\nimport { useModelSelectorMenus } from './useModelSelectorMenus'\nimport { useModelSelectorModelOptions } from './useModelSelectorModelOptions'\nimport { useModelSelectorState } from './useModelSelectorState'\nimport { useModelSelectorActions } from './useModelSelectorActions'\nimport { useEscapeNavigation } from './flow/useEscapeNavigation'\n\nfunction normalizeProviderForApiKeyEnvVar(provider: string): string {\n // Some \"coding plan\" providers share auth with their base provider.\n if (provider === 'glm-coding') return 'glm'\n if (provider === 'minimax-coding') return 'minimax'\n return provider\n}\n\nfunction getApiKeyEnvVarNames(provider: string): string[] {\n const normalizedProvider = normalizeProviderForApiKeyEnvVar(provider)\n const sanitizedProvider = normalizedProvider.replace(/[^a-z0-9]/gi, '_')\n const canonical = `${sanitizedProvider.toUpperCase()}_API_KEY`\n const legacy = `${normalizedProvider.toUpperCase()}_API_KEY`\n return canonical === legacy ? [canonical] : [canonical, legacy]\n}\n\nfunction readApiKeyFromEnv(provider: string): string | undefined {\n for (const envVarName of getApiKeyEnvVarNames(provider)) {\n const value = process.env[envVarName]\n if (value) return value\n }\n return undefined\n}\n\nexport function useModelSelectorController(\n props: ModelSelectorProps,\n): ModelSelectorViewProps {\n const theme = getTheme()\n const layout = useScreenLayout({ compactColumns: 76 })\n const terminalRows = layout.rows\n const terminalColumns = layout.columns\n const tightLayout = layout.tightLayout\n const compactLayout = layout.compactLayout\n const containerPaddingY = layout.paddingY\n const containerGap = layout.gap\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n const exitStateForScreens = useMemo(\n () => ({ pending: exitState.pending, keyName: exitState.keyName ?? '' }),\n [exitState.pending, exitState.keyName],\n )\n\n const onDone = () => {\n printModelConfig()\n props.onDone()\n }\n\n const state = useModelSelectorState({\n skipModelType: props.skipModelType ?? false,\n })\n\n const menus = useModelSelectorMenus({\n containerPaddingY,\n containerGap,\n setProviderFocusIndex: state.setProviderFocusIndex,\n setPartnerProviderFocusIndex: state.setPartnerProviderFocusIndex,\n setCodingPlanFocusIndex: state.setCodingPlanFocusIndex,\n })\n\n const { modelOptions } = useModelSelectorModelOptions({\n selectedProvider: state.selectedProvider,\n availableModels: state.availableModels,\n modelSearchQuery: state.modelSearchQuery,\n })\n\n useEffect(() => {\n if (!state.apiKeyEdited && state.selectedProvider) {\n const envValue = readApiKeyFromEnv(state.selectedProvider) ?? ''\n state.setApiKey(envValue)\n state.setCursorOffset(envValue.length)\n }\n }, [\n state.apiKeyEdited,\n state.selectedProvider,\n state.setApiKey,\n state.setCursorOffset,\n ])\n\n useEffect(() => {\n if (\n state.currentScreen === 'contextLength' &&\n !CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === state.contextLength)\n ) {\n state.setContextLength(DEFAULT_CONTEXT_LENGTH)\n }\n }, [state.contextLength, state.currentScreen, state.setContextLength])\n\n const actions = useModelSelectorActions({ props, state, onDone })\n\n useEscapeNavigation(actions.handleBack, props.abortController)\n\n useModelSelectorInput({\n currentScreen: state.currentScreen,\n mainMenuOptions: menus.mainMenuOptions,\n providerFocusIndex: state.providerFocusIndex,\n setProviderFocusIndex: state.setProviderFocusIndex,\n partnerProviderOptions: menus.partnerProviderOptions,\n partnerProviderFocusIndex: state.partnerProviderFocusIndex,\n setPartnerProviderFocusIndex: state.setPartnerProviderFocusIndex,\n codingPlanOptions: menus.codingPlanOptions,\n codingPlanFocusIndex: state.codingPlanFocusIndex,\n setCodingPlanFocusIndex: state.setCodingPlanFocusIndex,\n selectedProvider: state.selectedProvider,\n apiKey: state.apiKey,\n resourceName: state.resourceName,\n providerBaseUrl: state.providerBaseUrl,\n customBaseUrl: state.customBaseUrl,\n customModelName: state.customModelName,\n contextLength: state.contextLength,\n setContextLength: state.setContextLength,\n isTestingConnection: state.isTestingConnection,\n connectionTestResult: state.connectionTestResult,\n activeFieldIndex: state.activeFieldIndex,\n setActiveFieldIndex: state.setActiveFieldIndex,\n handleProviderSelection: actions.handleProviderSelection,\n handleApiKeySubmit: actions.handleApiKeySubmit,\n fetchModelsWithRetry: actions.fetchModelsWithRetry,\n navigateTo: state.navigateTo,\n handleResourceNameSubmit: actions.handleResourceNameSubmit,\n handleCustomBaseUrlSubmit: actions.handleCustomBaseUrlSubmit,\n handleProviderBaseUrlSubmit: actions.handleProviderBaseUrlSubmit,\n handleCustomModelSubmit: actions.handleCustomModelSubmit,\n handleConfirmation: actions.handleConfirmation,\n setValidationError: state.setValidationError,\n handleConnectionTest: actions.handleConnectionTest,\n handleContextLengthSubmit: actions.handleContextLengthSubmit,\n setModelLoadError: state.setModelLoadError,\n getFormFieldsForModelParams: actions.getFormFieldsForModelParams,\n handleModelParamsSubmit: actions.handleModelParamsSubmit,\n })\n\n return {\n theme,\n exitState: exitStateForScreens,\n terminalRows,\n terminalColumns,\n compactLayout,\n tightLayout,\n containerPaddingY,\n containerGap,\n currentScreen: state.currentScreen,\n selectedProvider: state.selectedProvider,\n selectedModel: state.selectedModel,\n apiKey: state.apiKey,\n cursorOffset: state.cursorOffset,\n handleApiKeyChange: actions.handleApiKeyChange,\n handleApiKeySubmit: actions.handleApiKeySubmit,\n handleCursorOffsetChange: actions.handleCursorOffsetChange,\n apiKeyCleanedNotification: state.apiKeyCleanedNotification,\n isLoadingModels: state.isLoadingModels,\n modelLoadError: state.modelLoadError,\n providerBaseUrl: state.providerBaseUrl,\n setProviderBaseUrl: state.setProviderBaseUrl,\n providerBaseUrlCursorOffset: state.providerBaseUrlCursorOffset,\n setProviderBaseUrlCursorOffset: state.setProviderBaseUrlCursorOffset,\n customBaseUrl: state.customBaseUrl,\n setCustomBaseUrl: state.setCustomBaseUrl,\n customBaseUrlCursorOffset: state.customBaseUrlCursorOffset,\n setCustomBaseUrlCursorOffset: state.setCustomBaseUrlCursorOffset,\n customModelName: state.customModelName,\n setCustomModelName: state.setCustomModelName,\n customModelNameCursorOffset: state.customModelNameCursorOffset,\n setCustomModelNameCursorOffset: state.setCustomModelNameCursorOffset,\n resourceName: state.resourceName,\n setResourceName: state.setResourceName,\n resourceNameCursorOffset: state.resourceNameCursorOffset,\n setResourceNameCursorOffset: state.setResourceNameCursorOffset,\n availableModels: state.availableModels,\n modelSearchQuery: state.modelSearchQuery,\n modelSearchCursorOffset: state.modelSearchCursorOffset,\n handleModelSearchChange: actions.handleModelSearchChange,\n handleModelSearchCursorOffsetChange:\n actions.handleModelSearchCursorOffsetChange,\n modelOptions,\n handleResourceNameSubmit: actions.handleResourceNameSubmit,\n handleCustomBaseUrlSubmit: actions.handleCustomBaseUrlSubmit,\n handleProviderBaseUrlSubmit: actions.handleProviderBaseUrlSubmit,\n handleCustomModelSubmit: actions.handleCustomModelSubmit,\n handleModelSelection: actions.handleModelSelection,\n handleModelParamsSubmit: actions.handleModelParamsSubmit,\n maxTokens: state.maxTokens,\n setMaxTokens: state.setMaxTokens,\n setSelectedMaxTokensPreset: state.setSelectedMaxTokensPreset,\n setMaxTokensCursorOffset: state.setMaxTokensCursorOffset,\n supportsReasoningEffort: state.supportsReasoningEffort,\n reasoningEffortOptions: actions.reasoningEffortOptions,\n reasoningEffort: state.reasoningEffort,\n setReasoningEffort: state.setReasoningEffort,\n requestStrategy: state.requestStrategy,\n requestStrategyOptions: actions.requestStrategyOptions,\n setRequestStrategy: state.setRequestStrategy,\n contextLength: state.contextLength,\n isTestingConnection: state.isTestingConnection,\n connectionTestResult: state.connectionTestResult,\n validationError: state.validationError,\n ollamaBaseUrl: state.ollamaBaseUrl,\n activeFieldIndex: state.activeFieldIndex,\n setActiveFieldIndex: state.setActiveFieldIndex,\n getFormFieldsForModelParams: actions.getFormFieldsForModelParams,\n mainMenuOptions: menus.mainMenuOptions,\n providerFocusIndex: state.providerFocusIndex,\n providerReservedLines: menus.providerReservedLines,\n partnerProviderOptions: menus.partnerProviderOptions,\n partnerProviderFocusIndex: state.partnerProviderFocusIndex,\n partnerReservedLines: menus.partnerReservedLines,\n codingPlanOptions: menus.codingPlanOptions,\n codingPlanFocusIndex: state.codingPlanFocusIndex,\n codingReservedLines: menus.codingReservedLines,\n formatApiKeyDisplay: actions.formatApiKeyDisplay,\n getProviderLabel: menus.getProviderLabel,\n }\n}\n", "import chalk from 'chalk'\nimport { getGlobalConfig } from '#core/utils/config'\nimport { isStdioPatchedForTui, writeToStdout } from '#cli-utils/stdio'\n\nexport function printModelConfig() {\n // Avoid corrupting Ink rendering. If a TUI stdio guard is active, skip\n // writing to the real terminal output and rely on in-UI feedback instead.\n if (isStdioPatchedForTui()) return\n\n const config = getGlobalConfig()\n const modelProfiles = config.modelProfiles || []\n const activeProfiles = modelProfiles.filter(p => p.isActive)\n\n if (activeProfiles.length === 0) {\n writeToStdout(`${chalk.gray(' \u23BF No active model profiles configured')}\\n`)\n return\n }\n\n const profileSummary = activeProfiles\n .map(p => `${p.name} (${p.provider}: ${p.modelName})`)\n .join(' | ')\n writeToStdout(`${chalk.gray(` \u23BF ${profileSummary}`)}\\n`)\n}\n", "import { useKeypress } from '#ui-ink/hooks/useKeypress'\nimport { CONTEXT_LENGTH_OPTIONS, DEFAULT_CONTEXT_LENGTH } from './flow/options'\nimport type { ModelSelectorScreen } from './flow/state'\nimport type { ConnectionTestResult } from './flow/actions/connectionTest'\nimport type { ProviderType } from '#core/utils/config'\nimport { logError } from '#core/utils/log'\n\ntype Option = { value: string; label: string }\n\nexport function useModelSelectorInput(args: {\n currentScreen: ModelSelectorScreen\n mainMenuOptions: Option[]\n providerFocusIndex: number\n setProviderFocusIndex: (value: number | ((prev: number) => number)) => void\n partnerProviderOptions: Option[]\n partnerProviderFocusIndex: number\n setPartnerProviderFocusIndex: (\n value: number | ((prev: number) => number),\n ) => void\n codingPlanOptions: Option[]\n codingPlanFocusIndex: number\n setCodingPlanFocusIndex: (value: number | ((prev: number) => number)) => void\n\n selectedProvider: ProviderType\n apiKey: string\n resourceName: string\n providerBaseUrl: string\n customBaseUrl: string\n customModelName: string\n\n contextLength: number\n setContextLength: (value: number) => void\n\n isTestingConnection: boolean\n connectionTestResult: ConnectionTestResult | null\n\n activeFieldIndex: number\n setActiveFieldIndex: (value: number | ((prev: number) => number)) => void\n\n handleProviderSelection: (provider: string) => void | Promise<void>\n handleApiKeySubmit: (key: string) => void | Promise<void>\n fetchModelsWithRetry: () => Promise<unknown>\n navigateTo: (screen: ModelSelectorScreen) => void\n handleResourceNameSubmit: (name: string) => void\n handleCustomBaseUrlSubmit: (url: string) => void\n handleProviderBaseUrlSubmit: (url: string) => void\n handleCustomModelSubmit: (model: string) => void\n handleConfirmation: () => Promise<void>\n setValidationError: (value: string | null) => void\n handleConnectionTest: () => void\n handleContextLengthSubmit: () => void\n setModelLoadError: (value: string | null) => void\n getFormFieldsForModelParams: () => Array<{ name: string; component: string }>\n handleModelParamsSubmit: () => void\n}) {\n useKeypress((input, key) => {\n const inputChar = input.length === 1 ? input : ''\n\n const clampIndex = (next: number, length: number) => {\n if (length <= 0) return 0\n return Math.max(0, Math.min(next, length - 1))\n }\n\n const isUp = key.upArrow || inputChar === 'k'\n const isDown = key.downArrow || inputChar === 'j'\n const isPageUp = key.pageUp\n const isPageDown = key.pageDown\n const isHome = key.home\n const isEnd = key.end\n\n const pageJump = 5\n\n if (args.currentScreen === 'provider') {\n if (isHome) {\n args.setProviderFocusIndex(0)\n return true\n }\n if (isEnd) {\n args.setProviderFocusIndex(\n clampIndex(\n args.mainMenuOptions.length - 1,\n args.mainMenuOptions.length,\n ),\n )\n return true\n }\n if (isUp) {\n args.setProviderFocusIndex(prev =>\n clampIndex(prev - 1, args.mainMenuOptions.length),\n )\n return true\n }\n if (isDown) {\n args.setProviderFocusIndex(prev =>\n clampIndex(prev + 1, args.mainMenuOptions.length),\n )\n return true\n }\n if (isPageUp) {\n args.setProviderFocusIndex(prev =>\n clampIndex(prev - pageJump, args.mainMenuOptions.length),\n )\n return true\n }\n if (isPageDown) {\n args.setProviderFocusIndex(prev =>\n clampIndex(prev + pageJump, args.mainMenuOptions.length),\n )\n return true\n }\n if (key.return) {\n const opt = args.mainMenuOptions[args.providerFocusIndex]\n if (opt) {\n void args.handleProviderSelection(opt.value)\n }\n return true\n }\n }\n\n if (args.currentScreen === 'partnerProviders') {\n if (isHome) {\n args.setPartnerProviderFocusIndex(0)\n return true\n }\n if (isEnd) {\n args.setPartnerProviderFocusIndex(\n clampIndex(\n args.partnerProviderOptions.length - 1,\n args.partnerProviderOptions.length,\n ),\n )\n return true\n }\n if (isUp) {\n args.setPartnerProviderFocusIndex(prev =>\n clampIndex(prev - 1, args.partnerProviderOptions.length),\n )\n return true\n }\n if (isDown) {\n args.setPartnerProviderFocusIndex(prev =>\n clampIndex(prev + 1, args.partnerProviderOptions.length),\n )\n return true\n }\n if (isPageUp) {\n args.setPartnerProviderFocusIndex(prev =>\n clampIndex(prev - pageJump, args.partnerProviderOptions.length),\n )\n return true\n }\n if (isPageDown) {\n args.setPartnerProviderFocusIndex(prev =>\n clampIndex(prev + pageJump, args.partnerProviderOptions.length),\n )\n return true\n }\n if (key.return) {\n const opt = args.partnerProviderOptions[args.partnerProviderFocusIndex]\n if (opt) {\n void args.handleProviderSelection(opt.value)\n }\n return true\n }\n }\n\n if (args.currentScreen === 'partnerCodingPlans') {\n if (isHome) {\n args.setCodingPlanFocusIndex(0)\n return true\n }\n if (isEnd) {\n args.setCodingPlanFocusIndex(\n clampIndex(\n args.codingPlanOptions.length - 1,\n args.codingPlanOptions.length,\n ),\n )\n return true\n }\n if (isUp) {\n args.setCodingPlanFocusIndex(prev =>\n clampIndex(prev - 1, args.codingPlanOptions.length),\n )\n return true\n }\n if (isDown) {\n args.setCodingPlanFocusIndex(prev =>\n clampIndex(prev + 1, args.codingPlanOptions.length),\n )\n return true\n }\n if (isPageUp) {\n args.setCodingPlanFocusIndex(prev =>\n clampIndex(prev - pageJump, args.codingPlanOptions.length),\n )\n return true\n }\n if (isPageDown) {\n args.setCodingPlanFocusIndex(prev =>\n clampIndex(prev + pageJump, args.codingPlanOptions.length),\n )\n return true\n }\n if (key.return) {\n const opt = args.codingPlanOptions[args.codingPlanFocusIndex]\n if (opt) {\n void args.handleProviderSelection(opt.value)\n }\n return true\n }\n }\n\n if (args.currentScreen === 'apiKey' && key.tab) {\n if (\n args.selectedProvider === 'anthropic' ||\n args.selectedProvider === 'kimi' ||\n args.selectedProvider === 'deepseek' ||\n args.selectedProvider === 'qwen' ||\n args.selectedProvider === 'glm' ||\n args.selectedProvider === 'glm-coding' ||\n args.selectedProvider === 'minimax' ||\n args.selectedProvider === 'minimax-coding' ||\n args.selectedProvider === 'baidu-qianfan' ||\n args.selectedProvider === 'siliconflow' ||\n args.selectedProvider === 'custom-openai'\n ) {\n args.navigateTo('modelInput')\n return true\n }\n\n void args.fetchModelsWithRetry().catch(error => {\n logError(error)\n })\n return true\n }\n\n if (args.currentScreen === 'confirmation' && key.return) {\n void args.handleConfirmation().catch(error => {\n logError(error)\n args.setValidationError(\n error instanceof Error ? error.message : 'Unexpected error occurred',\n )\n })\n return true\n }\n\n if (args.currentScreen === 'connectionTest') {\n if (key.return) {\n if (!args.isTestingConnection && !args.connectionTestResult) {\n args.handleConnectionTest()\n } else if (\n args.connectionTestResult &&\n args.connectionTestResult.success\n ) {\n args.navigateTo('confirmation')\n } else if (\n args.connectionTestResult &&\n !args.connectionTestResult.success\n ) {\n args.handleConnectionTest()\n }\n return true\n }\n }\n\n if (args.currentScreen === 'contextLength') {\n if (key.return) {\n args.handleContextLengthSubmit()\n return true\n }\n\n if (isUp) {\n const currentIndex = CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === args.contextLength,\n )\n const newIndex =\n currentIndex > 0\n ? currentIndex - 1\n : currentIndex === -1\n ? CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === DEFAULT_CONTEXT_LENGTH,\n ) || 0\n : CONTEXT_LENGTH_OPTIONS.length - 1\n args.setContextLength(CONTEXT_LENGTH_OPTIONS[newIndex].value)\n return true\n }\n\n if (isDown) {\n const currentIndex = CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === args.contextLength,\n )\n const newIndex =\n currentIndex === -1\n ? CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === DEFAULT_CONTEXT_LENGTH,\n ) || 0\n : (currentIndex + 1) % CONTEXT_LENGTH_OPTIONS.length\n args.setContextLength(CONTEXT_LENGTH_OPTIONS[newIndex].value)\n return true\n }\n }\n\n if (\n args.currentScreen === 'apiKey' &&\n ((key.ctrl && input === 'v') || (key.meta && input === 'v'))\n ) {\n args.setModelLoadError(\n \"Please use your terminal's paste functionality or type the API key manually\",\n )\n return true\n }\n\n if (args.currentScreen === 'modelParams' && key.tab) {\n const formFields = args.getFormFieldsForModelParams()\n args.setActiveFieldIndex(current => (current + 1) % formFields.length)\n return true\n }\n\n if (args.currentScreen === 'modelParams' && key.return) {\n const formFields = args.getFormFieldsForModelParams()\n const currentField = formFields[args.activeFieldIndex]\n\n if (\n currentField?.name === 'submit' ||\n args.activeFieldIndex === formFields.length - 1\n ) {\n args.handleModelParamsSubmit()\n } else if (currentField?.component === 'select') {\n args.setActiveFieldIndex(current =>\n Math.min(current + 1, formFields.length - 1),\n )\n }\n return true\n }\n })\n}\n", "import { useEffect, useMemo } from 'react'\nimport models, { providers } from '#core/constants/models'\n\ntype Option = { value: string; label: string }\n\nexport function useModelSelectorMenus(args: {\n containerPaddingY: number\n containerGap: number\n setProviderFocusIndex: (value: number | ((prev: number) => number)) => void\n setPartnerProviderFocusIndex: (\n value: number | ((prev: number) => number),\n ) => void\n setCodingPlanFocusIndex: (value: number | ((prev: number) => number)) => void\n}) {\n const {\n setProviderFocusIndex,\n setPartnerProviderFocusIndex,\n setCodingPlanFocusIndex,\n } = args\n\n function getProviderLabel(provider: string, modelCount: number): string {\n if (providers[provider]) {\n const wipTag = '(' + 'WI' + 'P' + ')'\n return `${providers[provider].name} ${providers[provider].status === 'wip' ? wipTag : ''}`\n }\n return `${provider}`\n }\n\n const mainMenuOptions: Option[] = useMemo(() => {\n return [\n { value: 'partnerProviders', label: 'Other Providers \\u2192' },\n { value: 'partnerCodingPlans', label: 'Some Coding Plans \\u2192' },\n { value: 'custom-openai', label: 'Custom OpenAI API' },\n { value: 'custom-anthropic', label: 'Custom Anthropic API' },\n { value: 'ollama', label: 'Ollama' },\n ]\n }, [])\n\n const rankedProviders = useMemo(\n () => [\n 'openai',\n 'anthropic',\n 'gemini',\n 'glm',\n 'kimi',\n 'minimax',\n 'qwen',\n 'deepseek',\n 'openrouter',\n 'burncloud',\n 'siliconflow',\n 'baidu-qianfan',\n 'mistral',\n 'xai',\n 'groq',\n 'azure',\n ],\n [],\n )\n\n const partnerProviders = useMemo(\n () =>\n rankedProviders.filter(\n provider =>\n providers[provider] &&\n !provider.includes('coding') &&\n provider !== 'custom-openai' &&\n provider !== 'ollama',\n ),\n [rankedProviders],\n )\n\n const codingPlanProviders = useMemo(\n () =>\n Object.keys(providers).filter(provider => provider.includes('coding')),\n [],\n )\n\n const partnerProviderOptions: Option[] = useMemo(\n () =>\n partnerProviders.map(provider => {\n const modelCount = models[provider]?.length || 0\n return {\n label: getProviderLabel(provider, modelCount),\n value: provider,\n }\n }),\n [partnerProviders],\n )\n\n const codingPlanOptions: Option[] = useMemo(\n () =>\n codingPlanProviders.map(provider => {\n const modelCount = models[provider]?.length || 0\n return {\n label: getProviderLabel(provider, modelCount),\n value: provider,\n }\n }),\n [codingPlanProviders],\n )\n\n // Reserve non-list UI rows conservatively to avoid Ink terminal-scroll tearing when\n // the wizard is close to full height (border + title + description + footer).\n const providerReservedLines =\n 10 + args.containerPaddingY * 2 + args.containerGap * 4\n const partnerReservedLines =\n 12 + args.containerPaddingY * 2 + args.containerGap * 4\n const codingReservedLines = partnerReservedLines\n\n const clampIndex = (index: number, length: number) =>\n length === 0 ? 0 : Math.max(0, Math.min(index, length - 1))\n\n useEffect(() => {\n setProviderFocusIndex(prev => clampIndex(prev, mainMenuOptions.length))\n }, [setProviderFocusIndex, mainMenuOptions.length])\n\n useEffect(() => {\n setPartnerProviderFocusIndex(prev =>\n clampIndex(prev, partnerProviderOptions.length),\n )\n }, [setPartnerProviderFocusIndex, partnerProviderOptions.length])\n\n useEffect(() => {\n setCodingPlanFocusIndex(prev => clampIndex(prev, codingPlanOptions.length))\n }, [setCodingPlanFocusIndex, codingPlanOptions.length])\n\n return {\n mainMenuOptions,\n partnerProviderOptions,\n codingPlanOptions,\n providerReservedLines,\n partnerReservedLines,\n codingReservedLines,\n getProviderLabel,\n }\n}\n", "import { useMemo } from 'react'\nimport models from '#core/constants/models'\nimport type { ModelInfo } from './flow/types'\n\nfunction formatNumber(num: number): string {\n if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`\n if (num >= 1000) return `${(num / 1000).toFixed(0)}K`\n return num.toString()\n}\n\nfunction getModelDetails(model: ModelInfo): string {\n const details = []\n if (model.context_length) {\n details.push(`${formatNumber(model.context_length)} tokens`)\n } else if (model.max_tokens) {\n details.push(`${formatNumber(model.max_tokens)} tokens`)\n }\n if (model.supports_vision) details.push('vision')\n if (model.supports_function_calling) details.push('tools')\n return details.length > 0 ? ` (${details.join(', ')})` : ''\n}\n\nfunction sortModelsByPriority(models: ModelInfo[]) {\n const priorityKeywords = [\n 'claude',\n 'kimi',\n 'deepseek',\n 'minimax',\n 'o3',\n 'gpt',\n 'qwen',\n ]\n\n return models.sort((a, b) => {\n const aModelLower = a.model?.toLowerCase() || ''\n const bModelLower = b.model?.toLowerCase() || ''\n\n const aHasPriority = priorityKeywords.some(keyword =>\n aModelLower.includes(keyword),\n )\n const bHasPriority = priorityKeywords.some(keyword =>\n bModelLower.includes(keyword),\n )\n\n if (aHasPriority && !bHasPriority) return -1\n if (!aHasPriority && bHasPriority) return 1\n\n return a.model.localeCompare(b.model)\n })\n}\n\nexport function useModelSelectorModelOptions(args: {\n selectedProvider: string\n availableModels: ModelInfo[]\n modelSearchQuery: string\n}) {\n const ourModelNames = useMemo(() => {\n return new Set(\n (models[args.selectedProvider as keyof typeof models] || []).map(\n (model: any) => model.model,\n ),\n )\n }, [args.selectedProvider])\n\n const filteredModels = useMemo(() => {\n return args.modelSearchQuery\n ? args.availableModels.filter(model =>\n model.model\n ?.toLowerCase()\n .includes(args.modelSearchQuery.toLowerCase()),\n )\n : args.availableModels\n }, [args.availableModels, args.modelSearchQuery])\n\n const sortedFilteredModels = useMemo(\n () => sortModelsByPriority([...filteredModels]),\n [filteredModels],\n )\n\n const modelOptions = useMemo(\n () =>\n sortedFilteredModels.map(model => {\n const _isInOurModels = ourModelNames.has(model.model)\n return {\n label: `${model.model}${getModelDetails(model)}`,\n value: model.model,\n }\n }),\n [ourModelNames, sortedFilteredModels],\n )\n\n return { modelOptions }\n}\n", "import { useState } from 'react'\nimport { getGlobalConfig, type ProviderType } from '#core/utils/config'\nimport type { ConnectionTestResult } from './flow/actions/connectionTest'\nimport {\n DEFAULT_CONTEXT_LENGTH,\n DEFAULT_MAX_TOKENS,\n type ReasoningEffortOption,\n type RequestStrategyOption,\n} from './flow/options'\nimport {\n createInitialScreenStack,\n getCurrentScreen,\n pushScreen,\n type ModelSelectorScreen,\n} from './flow/state'\nimport type { ModelInfo } from './flow/types'\n\nexport function useModelSelectorState(opts: { skipModelType: boolean }) {\n const config = getGlobalConfig()\n\n const [screenStack, setScreenStack] = useState<ModelSelectorScreen[]>(() =>\n createInitialScreenStack({ skipModelType: opts.skipModelType }),\n )\n\n const currentScreen = getCurrentScreen(screenStack)\n const navigateTo = (screen: ModelSelectorScreen) => {\n setScreenStack(prev => pushScreen(prev, screen))\n }\n\n const [selectedProvider, setSelectedProvider] = useState<ProviderType>(\n config.primaryProvider ?? 'anthropic',\n )\n const [selectedModel, setSelectedModel] = useState<string>('')\n const [apiKey, setApiKey] = useState<string>('')\n\n const [maxTokens, setMaxTokens] = useState<string>(\n config.maxTokens?.toString() || DEFAULT_MAX_TOKENS.toString(),\n )\n const [maxTokensMode, setMaxTokensMode] = useState<'preset' | 'custom'>(\n 'preset',\n )\n const [selectedMaxTokensPreset, setSelectedMaxTokensPreset] =\n useState<number>(config.maxTokens || DEFAULT_MAX_TOKENS)\n const [reasoningEffort, setReasoningEffort] =\n useState<ReasoningEffortOption | null>('medium')\n const [supportsReasoningEffort, setSupportsReasoningEffort] =\n useState<boolean>(false)\n\n const [contextLength, setContextLength] = useState<number>(\n DEFAULT_CONTEXT_LENGTH,\n )\n\n const [requestStrategy, setRequestStrategy] =\n useState<RequestStrategyOption>('auto')\n\n const [activeFieldIndex, setActiveFieldIndex] = useState(0)\n const [maxTokensCursorOffset, setMaxTokensCursorOffset] = useState<number>(0)\n\n const [apiKeyCleanedNotification, setApiKeyCleanedNotification] =\n useState<boolean>(false)\n\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([])\n const [isLoadingModels, setIsLoadingModels] = useState(false)\n const [modelLoadError, setModelLoadError] = useState<string | null>(null)\n const [modelSearchQuery, setModelSearchQuery] = useState<string>('')\n const [modelSearchCursorOffset, setModelSearchCursorOffset] =\n useState<number>(0)\n const [cursorOffset, setCursorOffset] = useState<number>(0)\n const [apiKeyEdited, setApiKeyEdited] = useState<boolean>(false)\n\n const [providerFocusIndex, setProviderFocusIndex] = useState(0)\n const [partnerProviderFocusIndex, setPartnerProviderFocusIndex] = useState(0)\n const [codingPlanFocusIndex, setCodingPlanFocusIndex] = useState(0)\n\n const [fetchRetryCount, setFetchRetryCount] = useState<number>(0)\n const [isRetrying, setIsRetrying] = useState<boolean>(false)\n\n const [isTestingConnection, setIsTestingConnection] = useState<boolean>(false)\n const [connectionTestResult, setConnectionTestResult] =\n useState<ConnectionTestResult | null>(null)\n\n const [validationError, setValidationError] = useState<string | null>(null)\n\n const [resourceName, setResourceName] = useState<string>('')\n const [resourceNameCursorOffset, setResourceNameCursorOffset] =\n useState<number>(0)\n const [customModelName, setCustomModelName] = useState<string>('')\n const [customModelNameCursorOffset, setCustomModelNameCursorOffset] =\n useState<number>(0)\n\n const [ollamaBaseUrl, setOllamaBaseUrl] = useState<string>(\n 'http://localhost:11434/v1',\n )\n\n const [customBaseUrl, setCustomBaseUrl] = useState<string>('')\n const [customBaseUrlCursorOffset, setCustomBaseUrlCursorOffset] =\n useState<number>(0)\n\n const [providerBaseUrl, setProviderBaseUrl] = useState<string>('')\n const [providerBaseUrlCursorOffset, setProviderBaseUrlCursorOffset] =\n useState<number>(0)\n\n return {\n screenStack,\n setScreenStack,\n currentScreen,\n navigateTo,\n selectedProvider,\n setSelectedProvider,\n selectedModel,\n setSelectedModel,\n apiKey,\n setApiKey,\n maxTokens,\n setMaxTokens,\n maxTokensMode,\n setMaxTokensMode,\n selectedMaxTokensPreset,\n setSelectedMaxTokensPreset,\n reasoningEffort,\n setReasoningEffort,\n supportsReasoningEffort,\n setSupportsReasoningEffort,\n contextLength,\n setContextLength,\n requestStrategy,\n setRequestStrategy,\n activeFieldIndex,\n setActiveFieldIndex,\n maxTokensCursorOffset,\n setMaxTokensCursorOffset,\n apiKeyCleanedNotification,\n setApiKeyCleanedNotification,\n availableModels,\n setAvailableModels,\n isLoadingModels,\n setIsLoadingModels,\n modelLoadError,\n setModelLoadError,\n modelSearchQuery,\n setModelSearchQuery,\n modelSearchCursorOffset,\n setModelSearchCursorOffset,\n cursorOffset,\n setCursorOffset,\n apiKeyEdited,\n setApiKeyEdited,\n providerFocusIndex,\n setProviderFocusIndex,\n partnerProviderFocusIndex,\n setPartnerProviderFocusIndex,\n codingPlanFocusIndex,\n setCodingPlanFocusIndex,\n fetchRetryCount,\n setFetchRetryCount,\n isRetrying,\n setIsRetrying,\n isTestingConnection,\n setIsTestingConnection,\n connectionTestResult,\n setConnectionTestResult,\n validationError,\n setValidationError,\n resourceName,\n setResourceName,\n resourceNameCursorOffset,\n setResourceNameCursorOffset,\n customModelName,\n setCustomModelName,\n customModelNameCursorOffset,\n setCustomModelNameCursorOffset,\n ollamaBaseUrl,\n setOllamaBaseUrl,\n customBaseUrl,\n setCustomBaseUrl,\n customBaseUrlCursorOffset,\n setCustomBaseUrlCursorOffset,\n providerBaseUrl,\n setProviderBaseUrl,\n providerBaseUrlCursorOffset,\n setProviderBaseUrlCursorOffset,\n }\n}\n\nexport type ModelSelectorState = ReturnType<typeof useModelSelectorState>\n", "export type ModelSelectorScreen =\n | 'provider'\n | 'partnerProviders'\n | 'partnerCodingPlans'\n | 'apiKey'\n | 'resourceName'\n | 'baseUrl'\n | 'model'\n | 'modelInput'\n | 'modelParams'\n | 'contextLength'\n | 'connectionTest'\n | 'confirmation'\n\nexport type ModelSelectorScreenStack = ModelSelectorScreen[]\n\nexport type BackEffect =\n | { type: 'exit' }\n | { type: 'resetProviderFocus' }\n | null\n\nexport function createInitialScreenStack(_opts?: {\n skipModelType?: boolean\n}): ModelSelectorScreenStack {\n return ['provider']\n}\n\nexport function getCurrentScreen(\n stack: ModelSelectorScreenStack,\n): ModelSelectorScreen {\n return stack[stack.length - 1] ?? 'provider'\n}\n\nexport function pushScreen(\n stack: ModelSelectorScreenStack,\n screen: ModelSelectorScreen,\n): ModelSelectorScreenStack {\n return [...stack, screen]\n}\n\nexport function popScreen(\n stack: ModelSelectorScreenStack,\n): ModelSelectorScreenStack {\n if (stack.length > 1) {\n return stack.slice(0, -1)\n }\n return stack\n}\n\nexport function handleBackNavigation(stack: ModelSelectorScreenStack): {\n stack: ModelSelectorScreenStack\n effect: BackEffect\n} {\n const currentScreen = getCurrentScreen(stack)\n\n // Special handling for submenus - they should go back to main menu\n if (\n currentScreen === 'partnerProviders' ||\n currentScreen === 'partnerCodingPlans'\n ) {\n return { stack: ['provider'], effect: { type: 'resetProviderFocus' } }\n }\n\n // If we're at the main provider screen, exit\n if (currentScreen === 'provider') {\n return { stack, effect: { type: 'exit' } }\n }\n\n // For all other screens, normal back navigation\n if (stack.length > 1) {\n return { stack: stack.slice(0, -1), effect: null }\n }\n\n // Fallback to provider screen\n return { stack: ['provider'], effect: { type: 'resetProviderFocus' } }\n}\n", "import type { ProviderType } from '#core/utils/config'\n\nconst OPENAI_COMPATIBLE_PROVIDERS: ReadonlySet<ProviderType> = new Set([\n 'azure',\n 'burncloud',\n 'minimax',\n 'kimi',\n 'deepseek',\n 'siliconflow',\n 'qwen',\n 'glm',\n 'glm-coding',\n 'baidu-qianfan',\n 'openai',\n 'mistral',\n 'xai',\n 'groq',\n 'openrouter',\n 'gemini',\n 'ollama',\n 'custom-openai',\n])\n\nexport function isOpenAICompatibleProvider(provider: ProviderType): boolean {\n return OPENAI_COMPATIBLE_PROVIDERS.has(provider)\n}\n", "import type { ProviderType } from '#core/utils/config'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport type { ConnectionTestResult } from './types'\nimport {\n buildCompatHeaders,\n classifyRequestFailure,\n type RequestHeadersProfile,\n type SystemPromptProfile,\n COMPAT_TOOL_ALLOWLIST,\n} from '#core/ai/llm/restrictedClientCompat'\nimport {\n getCLISyspromptPrefix,\n getCompatSyspromptPrefix,\n getCompatSystemPrompt,\n getSystemPrompt,\n} from '#core/constants/prompts'\nimport { randomUUID } from 'crypto'\nimport { mkdtemp, readFile, rm } from 'fs/promises'\nimport { tmpdir } from 'os'\nimport { join } from 'path'\nimport { FileWriteTool } from '#tools/tools/filesystem/FileWriteTool/FileWriteTool'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n if (Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms))\n}\n\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeout)\n }\n}\n\nfunction extractOpenAIToolCall(data: unknown): {\n toolName: string\n args: Record<string, unknown>\n} | null {\n const record = asRecord(data)\n if (!record) return null\n\n const choices = record.choices\n if (!Array.isArray(choices) || choices.length === 0) return null\n\n const firstChoice = asRecord(choices[0])\n const message = asRecord(firstChoice?.message)\n if (!message) return null\n\n const toolCalls = message.tool_calls\n if (Array.isArray(toolCalls) && toolCalls.length > 0) {\n const firstCall = asRecord(toolCalls[0])\n const fn = asRecord(firstCall?.function)\n const toolName = typeof fn?.name === 'string' ? fn.name : null\n const rawArgs = fn?.arguments\n if (!toolName) return null\n\n if (typeof rawArgs === 'string') {\n try {\n const parsed = JSON.parse(rawArgs) as unknown\n const args = asRecord(parsed)\n if (!args) return null\n return { toolName, args }\n } catch {\n return null\n }\n }\n\n const args = asRecord(rawArgs)\n if (!args) return null\n return { toolName, args }\n }\n\n const functionCall = asRecord(message.function_call)\n if (functionCall) {\n const toolName =\n typeof functionCall.name === 'string' ? functionCall.name : null\n const rawArgs = functionCall.arguments\n if (!toolName) return null\n if (typeof rawArgs !== 'string') return null\n try {\n const parsed = JSON.parse(rawArgs) as unknown\n const args = asRecord(parsed)\n if (!args) return null\n return { toolName, args }\n } catch {\n return null\n }\n }\n\n return null\n}\n\nfunction extractOpenAITextContent(data: unknown): string {\n const record = asRecord(data)\n if (record && Array.isArray(record.choices) && record.choices.length > 0) {\n const firstChoice = asRecord(record.choices[0])\n const message = asRecord(firstChoice?.message)\n const content = message?.content\n if (typeof content === 'string') return content\n }\n if (record && typeof record.reply === 'string') return record.reply\n if (record && record.output) {\n const output = asRecord(record.output)\n const text = output?.text ?? record.output\n return typeof text === 'string' ? text : String(text ?? '')\n }\n return ''\n}\n\nasync function buildSystemMessageContent(args: {\n model: string\n systemPromptProfile: SystemPromptProfile\n}): Promise<string> {\n const prefix =\n args.systemPromptProfile === 'compat'\n ? getCompatSyspromptPrefix()\n : getCLISyspromptPrefix()\n\n const promptBlocks =\n args.systemPromptProfile === 'compat'\n ? await getCompatSystemPrompt({\n model: args.model,\n toolNames: Array.from(COMPAT_TOOL_ALLOWLIST),\n })\n : await getSystemPrompt()\n\n return [prefix, ...promptBlocks].join('\\n')\n}\n\nexport async function testChatEndpoint({\n baseURL,\n endpointPath,\n endpointName,\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n requestHeadersProfile,\n systemPromptProfile,\n fallbackStepName,\n onProgress,\n}: {\n baseURL: string\n endpointPath: string\n endpointName: string\n selectedProvider: ProviderType\n selectedModel: string\n apiKey: string\n maxTokens: string\n requestHeadersProfile: RequestHeadersProfile\n systemPromptProfile: SystemPromptProfile\n fallbackStepName: string\n onProgress?: (result: ConnectionTestResult) => void\n}): Promise<ConnectionTestResult> {\n const testURL = `${baseURL.replace(/\\/+$/, '')}${endpointPath}`\n\n const networkRetryCount = 3\n const timeoutMs = 45_000\n\n for (let attempt = 1; attempt <= 1 + networkRetryCount; attempt++) {\n const attemptLabel = `${attempt}/${1 + networkRetryCount}`\n\n onProgress?.({\n success: false,\n phase: 'request',\n attempt,\n maxAttempts: 1 + networkRetryCount,\n message: `Sending tool-use request to ${endpointName} (${attemptLabel})...`,\n endpoint: endpointPath,\n fallbackStep: fallbackStepName,\n })\n\n const tempDir = await mkdtemp(join(tmpdir(), 'kode-model-test-'))\n const expectedContent = `KODE_MODEL_TEST_OK:${randomUUID()}`\n const expectedFilePath = join(tempDir, 'write-tool-test.txt')\n\n try {\n const system = await buildSystemMessageContent({\n model: selectedModel,\n systemPromptProfile,\n })\n\n const userPrompt = `You are being tested for tool-use support.\n\nYou MUST call the Write tool exactly once with:\n- file_path: ${expectedFilePath}\n- content: ${expectedContent}\n\nDo NOT include any other text. Do NOT call any other tool.`\n\n const tools = [\n {\n type: 'function',\n function: {\n name: 'Write',\n description: 'Write a file to the local filesystem',\n parameters: {\n type: 'object',\n additionalProperties: false,\n properties: {\n file_path: { type: 'string' },\n content: { type: 'string' },\n },\n required: ['file_path', 'content'],\n },\n },\n },\n ]\n\n const testPayload: Record<string, unknown> = {\n model: selectedModel,\n messages: [\n { role: 'system', content: system },\n { role: 'user', content: userPrompt },\n ],\n tools,\n tool_choice: { type: 'function', function: { name: 'Write' } },\n max_tokens: Math.max(parseInt(maxTokens) || 1024, 256),\n temperature: 0,\n stream: false,\n }\n\n if (selectedModel && selectedModel.toLowerCase().includes('gpt-5')) {\n debugLogger.api('GPT5_PARAMETER_FIX_APPLY', { model: selectedModel })\n\n if (typeof testPayload.max_tokens === 'number') {\n testPayload.max_completion_tokens = testPayload.max_tokens\n delete testPayload.max_tokens\n debugLogger.api('GPT5_PARAMETER_FIX_MAX_TOKENS', {\n model: selectedModel,\n max_completion_tokens: testPayload.max_completion_tokens,\n })\n }\n\n if (\n typeof testPayload.temperature === 'number' &&\n testPayload.temperature !== 1\n ) {\n debugLogger.api('GPT5_PARAMETER_FIX_TEMPERATURE', {\n model: selectedModel,\n from: testPayload.temperature,\n to: 1,\n })\n testPayload.temperature = 1\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(requestHeadersProfile === 'compat' ? buildCompatHeaders() : {}),\n }\n\n if (selectedProvider === 'azure') {\n headers['api-key'] = apiKey\n } else {\n headers.Authorization = `Bearer ${apiKey}`\n }\n\n const response = await fetchWithTimeout(\n testURL,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(testPayload),\n },\n timeoutMs,\n )\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => null)) as unknown\n const errorRecord = asRecord(errorData)\n const nestedErrorMessage = (() => {\n const nestedError = asRecord(errorRecord?.error)\n const nestedMessage = nestedError?.message\n return typeof nestedMessage === 'string' ? nestedMessage : null\n })()\n const errorMessage =\n nestedErrorMessage ||\n (typeof errorRecord?.message === 'string'\n ? errorRecord.message\n : null) ||\n response.statusText ||\n `HTTP ${response.status}`\n\n const syntheticError = Object.assign(new Error(errorMessage), {\n status: response.status,\n })\n const classified = classifyRequestFailure(syntheticError, {\n modelName: selectedModel,\n })\n const errorCategory =\n response.status >= 500\n ? 'network'\n : classified.kind === 'restricted_client_only'\n ? 'restricted_client_only'\n : classified.kind\n\n const result: ConnectionTestResult = {\n success: false,\n message: `${endpointName} failed (${response.status})`,\n endpoint: endpointPath,\n details: `Error: ${errorMessage}`,\n errorCategory,\n fallbackStep: fallbackStepName,\n }\n\n if (errorCategory === 'network' && attempt <= networkRetryCount) {\n const retryInMs = attempt * 5000\n onProgress?.({\n ...result,\n phase: 'retry_wait',\n attempt,\n maxAttempts: 1 + networkRetryCount,\n retryInMs,\n message: `${result.message} \u2014 retrying in ${Math.round(retryInMs / 1000)}s...`,\n })\n await sleep(retryInMs)\n continue\n }\n\n return result\n }\n\n const data = (await response.json()) as unknown\n debugLogger.api('CONNECTION_TEST_RESPONSE', {\n provider: selectedProvider,\n endpoint: endpointPath,\n ok: true,\n })\n\n const toolCall = extractOpenAIToolCall(data)\n if (!toolCall) {\n const responseContent = extractOpenAITextContent(data).trim()\n return {\n success: false,\n message: `${endpointName} connected but tool-use verification failed`,\n endpoint: endpointPath,\n errorCategory: 'tool_use_unsupported',\n fallbackStep: fallbackStepName,\n details:\n responseContent.length > 0\n ? `Model did not call the Write tool. Response: \"${responseContent}\"\\n\\nThis usually means the model/provider does not support tool use reliably. Try a newer/stronger model (e.g. glm4.7, minimax2.1, claude sonnet 4.5) or change request strategy.`\n : 'Model did not call the Write tool and returned an empty response.\\n\\nThis usually means the model/provider does not support tool use reliably. Try a newer/stronger model (e.g. glm4.7, minimax2.1, claude sonnet 4.5) or change request strategy.',\n }\n }\n\n if (toolCall.toolName !== 'Write') {\n return {\n success: false,\n message: `${endpointName} returned unexpected tool call`,\n endpoint: endpointPath,\n errorCategory: 'unexpected_tool_call',\n fallbackStep: fallbackStepName,\n details: `Expected tool \"Write\" but got \"${toolCall.toolName}\"`,\n }\n }\n\n const filePath = toolCall.args.file_path\n const content = toolCall.args.content\n if (typeof filePath !== 'string' || typeof content !== 'string') {\n return {\n success: false,\n message: `${endpointName} tool call arguments invalid`,\n endpoint: endpointPath,\n errorCategory: 'invalid_tool_args',\n fallbackStep: fallbackStepName,\n details: `Expected {file_path: string, content: string} but got: ${JSON.stringify(toolCall.args)}`,\n }\n }\n\n if (filePath !== expectedFilePath || content !== expectedContent) {\n return {\n success: false,\n message: `${endpointName} tool call arguments mismatch`,\n endpoint: endpointPath,\n errorCategory: 'invalid_tool_args',\n fallbackStep: fallbackStepName,\n details: `Expected file_path=\"${expectedFilePath}\" and exact content match, but got file_path=\"${filePath}\" content=\"${content}\"`,\n }\n }\n\n // Execute the requested tool call locally via the actual Write tool implementation.\n const writeContext = {\n messageId: 'model-connection-test',\n abortController: new AbortController(),\n readFileTimestamps: {} as Record<string, number>,\n } as const\n\n const writeGen = FileWriteTool.call(\n { file_path: expectedFilePath, content: expectedContent },\n writeContext as any,\n )\n for await (const step of writeGen) {\n if (step.type === 'result') break\n }\n\n const actual = await readFile(expectedFilePath, 'utf8')\n if (actual !== expectedContent) {\n return {\n success: false,\n message: `${endpointName} local file verification failed`,\n endpoint: endpointPath,\n errorCategory: 'local_verification_failed',\n fallbackStep: fallbackStepName,\n details: `File content mismatch after write; expected \"${expectedContent}\" but got \"${actual}\"`,\n }\n }\n\n return {\n success: true,\n message: `Tool-use connection test passed with ${endpointName}`,\n endpoint: endpointPath,\n fallbackStep: fallbackStepName,\n details: `Model successfully called Write and the file was verified: ${expectedFilePath}`,\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const classified = classifyRequestFailure(error, {\n modelName: selectedModel,\n })\n const errorCategory = message.toLowerCase().includes('abort')\n ? 'timeout'\n : classified.kind\n\n const result: ConnectionTestResult = {\n success: false,\n message: `${endpointName} connection failed`,\n endpoint: endpointPath,\n details: message,\n errorCategory,\n fallbackStep: fallbackStepName,\n }\n\n if (\n (errorCategory === 'network' || errorCategory === 'timeout') &&\n attempt <= networkRetryCount\n ) {\n const retryInMs = attempt * 5000\n onProgress?.({\n ...result,\n phase: 'retry_wait',\n attempt,\n maxAttempts: 1 + networkRetryCount,\n retryInMs,\n message: `${result.message} \u2014 retrying in ${Math.round(retryInMs / 1000)}s...`,\n })\n await sleep(retryInMs)\n continue\n }\n\n return result\n } finally {\n // Best-effort cleanup. The temp directory is used only for this connection test.\n try {\n await rm(tempDir, { recursive: true, force: true })\n } catch {\n // ignore\n }\n }\n }\n\n return {\n success: false,\n message: `${endpointName} connection failed`,\n endpoint: endpointPath,\n details: 'Exhausted retries',\n errorCategory: 'network',\n fallbackStep: fallbackStepName,\n }\n}\n", "import type { ProviderType } from '#core/utils/config'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport type { ConnectionTestResult } from './types'\nimport {\n buildCompatHeaders,\n classifyRequestFailure,\n type RequestHeadersProfile,\n type SystemPromptProfile,\n COMPAT_TOOL_ALLOWLIST,\n} from '#core/ai/llm/restrictedClientCompat'\nimport {\n getCLISyspromptPrefix,\n getCompatSyspromptPrefix,\n getCompatSystemPrompt,\n getSystemPrompt,\n} from '#core/constants/prompts'\nimport { randomUUID } from 'crypto'\nimport { mkdtemp, readFile, rm } from 'fs/promises'\nimport { tmpdir } from 'os'\nimport { join } from 'path'\nimport { FileWriteTool } from '#tools/tools/filesystem/FileWriteTool/FileWriteTool'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n if (Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms))\n}\n\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeout)\n }\n}\n\nfunction extractAnthropicToolCall(data: unknown): {\n toolName: string\n args: Record<string, unknown>\n} | null {\n const record = asRecord(data)\n if (!record) return null\n\n const content = record.content\n if (!Array.isArray(content)) return null\n\n const toolUse = content.find(block => asRecord(block)?.type === 'tool_use')\n const toolUseRecord = asRecord(toolUse)\n if (!toolUseRecord) return null\n\n const toolName =\n typeof toolUseRecord.name === 'string' ? toolUseRecord.name : null\n const args = asRecord(toolUseRecord.input)\n\n if (!toolName || !args) return null\n return { toolName, args }\n}\n\nfunction extractAnthropicTextContent(data: unknown): string {\n const record = asRecord(data)\n if (!record) return ''\n const content = record.content\n if (!Array.isArray(content)) return ''\n\n const texts = content\n .map(block => {\n const b = asRecord(block)\n if (!b || b.type !== 'text') return ''\n return typeof b.text === 'string' ? b.text : ''\n })\n .filter(Boolean)\n\n return texts.join('\\n').trim()\n}\n\nasync function buildSystemMessageContent(args: {\n model: string\n systemPromptProfile: SystemPromptProfile\n}): Promise<string> {\n const prefix =\n args.systemPromptProfile === 'compat'\n ? getCompatSyspromptPrefix()\n : getCLISyspromptPrefix()\n\n const promptBlocks =\n args.systemPromptProfile === 'compat'\n ? await getCompatSystemPrompt({\n model: args.model,\n toolNames: Array.from(COMPAT_TOOL_ALLOWLIST),\n })\n : await getSystemPrompt()\n\n return [prefix, ...promptBlocks].join('\\n')\n}\n\nexport async function testAnthropicMessagesEndpoint({\n baseURL,\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n requestHeadersProfile,\n systemPromptProfile,\n fallbackStepName,\n onProgress,\n}: {\n baseURL: string\n selectedProvider: ProviderType\n selectedModel: string\n apiKey: string\n maxTokens: string\n requestHeadersProfile: RequestHeadersProfile\n systemPromptProfile: SystemPromptProfile\n fallbackStepName: string\n onProgress?: (result: ConnectionTestResult) => void\n}): Promise<ConnectionTestResult> {\n const testURL = `${baseURL.replace(/\\/+$/, '')}/v1/messages`\n\n const networkRetryCount = 3\n const timeoutMs = 45_000\n\n for (let attempt = 1; attempt <= 1 + networkRetryCount; attempt++) {\n const attemptLabel = `${attempt}/${1 + networkRetryCount}`\n\n onProgress?.({\n success: false,\n phase: 'request',\n attempt,\n maxAttempts: 1 + networkRetryCount,\n message: `Sending tool-use request to ${selectedProvider} /v1/messages (${attemptLabel})...`,\n endpoint: '/v1/messages',\n fallbackStep: fallbackStepName,\n })\n\n const tempDir = await mkdtemp(join(tmpdir(), 'kode-model-test-'))\n const expectedContent = `KODE_MODEL_TEST_OK:${randomUUID()}`\n const expectedFilePath = join(tempDir, 'write-tool-test.txt')\n\n try {\n const system = await buildSystemMessageContent({\n model: selectedModel,\n systemPromptProfile,\n })\n\n const userPrompt = `You are being tested for tool-use support.\n\nYou MUST call the Write tool exactly once with:\n- file_path: ${expectedFilePath}\n- content: ${expectedContent}\n\nDo NOT include any other text. Do NOT call any other tool.`\n\n const tools = [\n {\n name: 'Write',\n description: 'Write a file to the local filesystem',\n input_schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n file_path: { type: 'string' },\n content: { type: 'string' },\n },\n required: ['file_path', 'content'],\n },\n },\n ]\n\n const testPayload: Record<string, unknown> = {\n model: selectedModel,\n system,\n messages: [{ role: 'user', content: userPrompt }],\n tools,\n tool_choice: { type: 'tool', name: 'Write' },\n max_tokens: Math.max(parseInt(maxTokens) || 1024, 256),\n temperature: 0,\n stream: false,\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': apiKey,\n ...(requestHeadersProfile === 'compat' ? buildCompatHeaders() : {}),\n }\n\n const response = await fetchWithTimeout(\n testURL,\n { method: 'POST', headers, body: JSON.stringify(testPayload) },\n timeoutMs,\n )\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => null)) as unknown\n const errorRecord = asRecord(errorData)\n const nestedErrorMessage = (() => {\n const nestedError = asRecord(errorRecord?.error)\n const nestedMessage = nestedError?.message\n return typeof nestedMessage === 'string' ? nestedMessage : null\n })()\n const errorMessage =\n nestedErrorMessage ||\n (typeof errorRecord?.message === 'string'\n ? errorRecord.message\n : null) ||\n response.statusText ||\n `HTTP ${response.status}`\n\n const syntheticError = Object.assign(new Error(errorMessage), {\n status: response.status,\n })\n const classified = classifyRequestFailure(syntheticError, {\n modelName: selectedModel,\n })\n const errorCategory =\n response.status >= 500\n ? 'network'\n : classified.kind === 'restricted_client_only'\n ? 'restricted_client_only'\n : classified.kind\n\n const result: ConnectionTestResult = {\n success: false,\n message: `${selectedProvider} failed (${response.status})`,\n endpoint: '/v1/messages',\n details: `Error: ${errorMessage}`,\n errorCategory,\n fallbackStep: fallbackStepName,\n }\n\n if (errorCategory === 'network' && attempt <= networkRetryCount) {\n const retryInMs = attempt * 5000\n onProgress?.({\n ...result,\n phase: 'retry_wait',\n attempt,\n maxAttempts: 1 + networkRetryCount,\n retryInMs,\n message: `${result.message} \u2014 retrying in ${Math.round(retryInMs / 1000)}s...`,\n })\n await sleep(retryInMs)\n continue\n }\n\n return result\n }\n\n const data = (await response.json()) as unknown\n debugLogger.api('CONNECTION_TEST_RESPONSE', {\n provider: selectedProvider,\n endpoint: '/v1/messages',\n ok: true,\n })\n\n const toolCall = extractAnthropicToolCall(data)\n if (!toolCall) {\n const responseContent = extractAnthropicTextContent(data).trim()\n return {\n success: false,\n message: `${selectedProvider} connected but tool-use verification failed`,\n endpoint: '/v1/messages',\n errorCategory: 'tool_use_unsupported',\n fallbackStep: fallbackStepName,\n details:\n responseContent.length > 0\n ? `Model did not call the Write tool. Response: \"${responseContent}\"\\n\\nThis usually means the model/provider does not support tool use reliably. Try a newer/stronger model (e.g. glm4.7, minimax2.1, claude sonnet 4.5) or change request strategy.`\n : 'Model did not call the Write tool and returned an empty response.\\n\\nThis usually means the model/provider does not support tool use reliably. Try a newer/stronger model (e.g. glm4.7, minimax2.1, claude sonnet 4.5) or change request strategy.',\n }\n }\n\n if (toolCall.toolName !== 'Write') {\n return {\n success: false,\n message: `${selectedProvider} returned unexpected tool call`,\n endpoint: '/v1/messages',\n errorCategory: 'unexpected_tool_call',\n fallbackStep: fallbackStepName,\n details: `Expected tool \"Write\" but got \"${toolCall.toolName}\"`,\n }\n }\n\n const filePath = toolCall.args.file_path\n const content = toolCall.args.content\n if (typeof filePath !== 'string' || typeof content !== 'string') {\n return {\n success: false,\n message: `${selectedProvider} tool call arguments invalid`,\n endpoint: '/v1/messages',\n errorCategory: 'invalid_tool_args',\n fallbackStep: fallbackStepName,\n details: `Expected {file_path: string, content: string} but got: ${JSON.stringify(toolCall.args)}`,\n }\n }\n\n if (filePath !== expectedFilePath || content !== expectedContent) {\n return {\n success: false,\n message: `${selectedProvider} tool call arguments mismatch`,\n endpoint: '/v1/messages',\n errorCategory: 'invalid_tool_args',\n fallbackStep: fallbackStepName,\n details: `Expected file_path=\"${expectedFilePath}\" and exact content match, but got file_path=\"${filePath}\" content=\"${content}\"`,\n }\n }\n\n // Execute the requested tool call locally via the actual Write tool implementation.\n const writeContext = {\n messageId: 'model-connection-test',\n abortController: new AbortController(),\n readFileTimestamps: {} as Record<string, number>,\n } as const\n\n const writeGen = FileWriteTool.call(\n { file_path: expectedFilePath, content: expectedContent },\n writeContext as any,\n )\n for await (const step of writeGen) {\n if (step.type === 'result') break\n }\n const actual = await readFile(expectedFilePath, 'utf8')\n if (actual !== expectedContent) {\n return {\n success: false,\n message: `${selectedProvider} local file verification failed`,\n endpoint: '/v1/messages',\n errorCategory: 'local_verification_failed',\n fallbackStep: fallbackStepName,\n details: `File content mismatch after write; expected \"${expectedContent}\" but got \"${actual}\"`,\n }\n }\n\n return {\n success: true,\n message: `Tool-use connection test passed with ${selectedProvider}`,\n endpoint: '/v1/messages',\n fallbackStep: fallbackStepName,\n details: `Model successfully called Write and the file was verified: ${expectedFilePath}`,\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const classified = classifyRequestFailure(error, {\n modelName: selectedModel,\n })\n const errorCategory = message.toLowerCase().includes('abort')\n ? 'timeout'\n : classified.kind\n\n const result: ConnectionTestResult = {\n success: false,\n message: `${selectedProvider} connection failed`,\n endpoint: '/v1/messages',\n details: message,\n errorCategory,\n fallbackStep: fallbackStepName,\n }\n\n if (\n (errorCategory === 'network' || errorCategory === 'timeout') &&\n attempt <= networkRetryCount\n ) {\n const retryInMs = attempt * 5000\n onProgress?.({\n ...result,\n phase: 'retry_wait',\n attempt,\n maxAttempts: 1 + networkRetryCount,\n retryInMs,\n message: `${result.message} \u2014 retrying in ${Math.round(retryInMs / 1000)}s...`,\n })\n await sleep(retryInMs)\n continue\n }\n\n return result\n } finally {\n try {\n await rm(tempDir, { recursive: true, force: true })\n } catch {\n // ignore\n }\n }\n }\n\n return {\n success: false,\n message: `${selectedProvider} connection failed`,\n endpoint: '/v1/messages',\n details: 'Exhausted retries',\n errorCategory: 'network',\n fallbackStep: fallbackStepName,\n }\n}\n", "import type { ProviderType } from '#core/utils/config'\nimport type { ConnectionTestResult } from './types'\nimport type {\n RequestHeadersProfile,\n SystemPromptProfile,\n} from '#core/ai/llm/restrictedClientCompat'\nimport { testAnthropicMessagesEndpoint } from './testAnthropicMessagesEndpoint'\n\nexport async function testProviderSpecificEndpoint({\n baseURL,\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n requestHeadersProfile,\n systemPromptProfile,\n fallbackStepName,\n onProgress,\n}: {\n baseURL: string\n selectedProvider: ProviderType\n selectedModel: string\n apiKey: string\n maxTokens: string\n requestHeadersProfile: RequestHeadersProfile\n systemPromptProfile: SystemPromptProfile\n fallbackStepName: string\n onProgress?: (result: ConnectionTestResult) => void\n}): Promise<ConnectionTestResult> {\n const isAnthropicCompatible =\n selectedProvider === 'anthropic' ||\n selectedProvider === 'bigdream' ||\n selectedProvider === 'opendev' ||\n selectedProvider === 'minimax-coding'\n\n if (isAnthropicCompatible) {\n return await testAnthropicMessagesEndpoint({\n baseURL,\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n requestHeadersProfile,\n systemPromptProfile,\n fallbackStepName,\n onProgress,\n })\n }\n\n return {\n success: false,\n message: `${selectedProvider} connection test not implemented`,\n details:\n 'This provider does not have a dedicated connection test yet. Choose an OpenAI-compatible provider (or a custom OpenAI base URL), or use an Anthropic-compatible provider/base URL.',\n }\n}\n", "import { providers } from '#core/constants/models'\nimport { isOpenAICompatibleProvider } from './openAICompatibility'\nimport type { ConnectionTestParams, ConnectionTestResult } from './types'\nimport { testChatEndpoint } from './testChatEndpoint'\nimport { testProviderSpecificEndpoint } from './testProviderSpecificEndpoint'\nimport { buildRequestStrategyFallbackPlan } from '#core/ai/llm/restrictedClientCompat'\n\nexport async function performConnectionTest(\n {\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n providerBaseUrl,\n customBaseUrl,\n resourceName,\n requestStrategy,\n }: ConnectionTestParams,\n options?: {\n onProgress?: (result: ConnectionTestResult) => void\n },\n): Promise<ConnectionTestResult> {\n try {\n let testBaseURL =\n providerBaseUrl || providers[selectedProvider]?.baseURL || ''\n\n if (selectedProvider === 'azure') {\n testBaseURL = `https://${resourceName}.openai.azure.com/openai/deployments/${selectedModel}`\n } else if (selectedProvider === 'custom-openai') {\n testBaseURL = customBaseUrl\n }\n\n const isOpenAICompatible = isOpenAICompatibleProvider(selectedProvider)\n\n if (isOpenAICompatible) {\n const endpointsToTry: Array<{ path: string; name: string }> = []\n\n if (selectedProvider === 'azure') {\n const azureApiVersion = '2024-06-01'\n endpointsToTry.push({\n path: `/chat/completions?api-version=${azureApiVersion}`,\n name: 'Azure OpenAI',\n })\n } else if (selectedProvider === 'minimax') {\n endpointsToTry.push(\n { path: '/text/chatcompletion_v2', name: 'MiniMax v2 (recommended)' },\n { path: '/chat/completions', name: 'Standard OpenAI' },\n )\n } else {\n endpointsToTry.push({\n path: '/chat/completions',\n name: 'Standard OpenAI',\n })\n }\n\n let lastError: ConnectionTestResult | null = null\n const fallbackPlan = buildRequestStrategyFallbackPlan(\n requestStrategy,\n selectedModel,\n )\n\n for (const endpoint of endpointsToTry) {\n for (const step of fallbackPlan) {\n options?.onProgress?.({\n success: false,\n phase: 'request',\n message: `Testing ${endpoint.name} (${endpoint.path}) with ${step.name}...`,\n endpoint: endpoint.path,\n fallbackStep: step.name,\n })\n\n const testResult = await testChatEndpoint({\n baseURL: testBaseURL,\n endpointPath: endpoint.path,\n endpointName: endpoint.name,\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n requestHeadersProfile: step.headers,\n systemPromptProfile: step.systemPrompt,\n fallbackStepName: step.name,\n onProgress: options?.onProgress,\n })\n\n if (testResult.success) {\n return testResult\n }\n\n lastError = testResult\n\n // Only advance to the next fallback step when we have evidence the provider\n // is enforcing a specific client fingerprint for an upstream-compat profile.\n if (testResult.errorCategory === 'restricted_client_only') {\n continue\n }\n\n // For non-compat-only failures, stop trying more fallback profiles for this endpoint.\n break\n }\n }\n\n return (\n lastError || {\n success: false,\n message: 'All endpoints failed',\n details: 'No endpoints could be reached',\n }\n )\n }\n\n let lastError: ConnectionTestResult | null = null\n const fallbackPlan = buildRequestStrategyFallbackPlan(\n requestStrategy,\n selectedModel,\n )\n\n for (const step of fallbackPlan) {\n options?.onProgress?.({\n success: false,\n phase: 'request',\n message: `Testing ${selectedProvider} with ${step.name}...`,\n endpoint: '/v1/messages',\n fallbackStep: step.name,\n })\n\n const result = await testProviderSpecificEndpoint({\n baseURL: testBaseURL,\n selectedProvider,\n selectedModel,\n apiKey,\n maxTokens,\n requestHeadersProfile: step.headers,\n systemPromptProfile: step.systemPrompt,\n fallbackStepName: step.name,\n onProgress: options?.onProgress,\n })\n\n if (result.success) {\n return result\n }\n\n lastError = result\n\n if (result.errorCategory === 'restricted_client_only') {\n continue\n }\n\n break\n }\n\n return (\n lastError || {\n success: false,\n message: 'Connection test failed',\n details: 'No provider-specific endpoint could be reached',\n }\n )\n } catch (error) {\n return {\n success: false,\n message: 'Connection test failed',\n details: error instanceof Error ? error.message : String(error),\n }\n }\n}\n", "import type { ConnectionTestParams, ConnectionTestResult } from './types'\nimport { performConnectionTest } from './performConnectionTest'\n\nexport async function runConnectionTestFlow({\n params,\n navigateTo,\n setTimeoutFn,\n onProgress,\n performConnectionTestFn,\n}: {\n params: ConnectionTestParams\n navigateTo: (screen: 'confirmation') => void\n setTimeoutFn?: (callback: () => void, delayMs: number) => unknown\n onProgress?: (result: ConnectionTestResult) => void\n performConnectionTestFn?: (\n params: ConnectionTestParams,\n options?: { onProgress?: (result: ConnectionTestResult) => void },\n ) => Promise<ConnectionTestResult>\n}): Promise<ConnectionTestResult> {\n const result = await (performConnectionTestFn ?? performConnectionTest)(\n params,\n { onProgress },\n )\n\n if (result.success) {\n const schedule =\n setTimeoutFn ?? ((callback, delayMs) => setTimeout(callback, delayMs))\n schedule(() => {\n navigateTo('confirmation')\n }, 2000)\n }\n\n return result\n}\n", "import type { ProviderType } from '#core/utils/config'\nimport { providers } from '#core/constants/models'\n\nimport type { ModelSelectorScreen } from '../state'\n\ntype Deps = {\n navigateTo: (screen: ModelSelectorScreen) => void\n setPartnerProviderFocusIndex: (idx: number) => void\n setCodingPlanFocusIndex: (idx: number) => void\n setSelectedProvider: (provider: ProviderType) => void\n setProviderBaseUrl: (baseUrl: string) => void\n saveConfiguration: (\n provider: ProviderType,\n model: string,\n ) => Promise<string | null>\n onDone: () => void\n selectedModel: string\n}\n\nexport async function handleProviderSelection(provider: string, deps: Deps) {\n const {\n navigateTo,\n setPartnerProviderFocusIndex,\n setCodingPlanFocusIndex,\n setSelectedProvider,\n setProviderBaseUrl,\n saveConfiguration,\n onDone,\n selectedModel,\n } = deps\n\n // Handle main menu navigation\n if (provider === 'partnerProviders') {\n setPartnerProviderFocusIndex(0)\n navigateTo('partnerProviders')\n return\n } else if (provider === 'partnerCodingPlans') {\n setCodingPlanFocusIndex(0)\n navigateTo('partnerCodingPlans')\n return\n } else if (provider === 'custom-anthropic') {\n // For custom Anthropic API, go to base URL screen\n setSelectedProvider('anthropic' as ProviderType)\n setProviderBaseUrl('')\n navigateTo('baseUrl')\n return\n }\n\n // Handle actual provider selection\n const providerType = provider as ProviderType\n setSelectedProvider(providerType)\n\n if (provider === 'custom') {\n // For custom provider, save and exit\n const modelId = await saveConfiguration(providerType, selectedModel || '')\n if (modelId) {\n onDone()\n }\n } else if (provider === 'custom-openai' || provider === 'ollama') {\n // For custom-openai and ollama, need to configure base URL\n const defaultBaseUrl = providers[providerType]?.baseURL || ''\n setProviderBaseUrl(defaultBaseUrl)\n navigateTo('baseUrl')\n } else {\n // For all standard partner providers, skip baseUrl and go directly to API key\n const defaultBaseUrl = providers[providerType]?.baseURL || ''\n setProviderBaseUrl(defaultBaseUrl)\n navigateTo('apiKey')\n }\n}\n", "import { providers } from '#core/constants/models'\nimport type { ModelPointerType, ProviderType } from '#core/utils/config'\nimport { setAllPointersToModel, setModelPointer } from '#core/utils/config'\nimport { getModelManager } from '#core/utils/model'\nimport type { RequestStrategy } from '#config'\n\nimport { DEFAULT_CONTEXT_LENGTH, DEFAULT_MAX_TOKENS } from '../options'\n\ntype Params = {\n provider: ProviderType\n model: string\n providerBaseUrl: string\n resourceName: string\n customBaseUrl: string\n apiKey: string\n maxTokens: string\n contextLength: number\n reasoningEffort: any\n requestStrategy?: RequestStrategy\n getModelManagerFn?: typeof getModelManager\n}\n\nexport async function saveModelConfiguration({\n provider,\n model,\n providerBaseUrl,\n resourceName,\n customBaseUrl,\n apiKey,\n maxTokens,\n contextLength,\n reasoningEffort,\n requestStrategy,\n getModelManagerFn,\n}: Params): Promise<string> {\n let baseURL = providerBaseUrl || providers[provider]?.baseURL || ''\n let actualProvider = provider\n\n // For Anthropic provider, use defaults\n if (provider === 'anthropic') {\n actualProvider = 'anthropic'\n baseURL = baseURL || 'https://api.anthropic.com'\n }\n\n // For Azure, construct the baseURL using the resource name\n if (provider === 'azure') {\n baseURL = `https://${resourceName}.openai.azure.com/openai/deployments/${model}`\n }\n // For custom OpenAI-compatible API, use the custom base URL\n else if (provider === 'custom-openai') {\n baseURL = customBaseUrl\n }\n\n // Use ModelManager's addModel method for duplicate validation\n const modelManager = (getModelManagerFn ?? getModelManager)()\n\n // Generate a unique name for the model\n // If model is empty (for providers without model selection), use provider name\n const displayModel = model || 'default'\n const modelDisplayName =\n `${providers[actualProvider]?.name || actualProvider} ${displayModel}`.trim()\n\n const modelConfig = {\n name: modelDisplayName,\n provider: actualProvider,\n modelName: model || actualProvider, // Use provider name if no specific model\n baseURL: baseURL,\n apiKey: apiKey || '',\n maxTokens: parseInt(maxTokens) || DEFAULT_MAX_TOKENS,\n contextLength: contextLength || DEFAULT_CONTEXT_LENGTH,\n reasoningEffort,\n ...(requestStrategy ? { requestStrategy } : {}),\n }\n\n // addModel method will throw error if duplicate exists\n return await modelManager.addModel(modelConfig)\n}\n\ntype ApplyPointersParams = {\n modelId: string\n isOnboarding: boolean\n targetPointer?: ModelPointerType\n setModelPointerFn?: typeof setModelPointer\n setAllPointersToModelFn?: typeof setAllPointersToModel\n}\n\nexport function applyPointersForNewModel({\n modelId,\n isOnboarding,\n targetPointer,\n setModelPointerFn,\n setAllPointersToModelFn,\n}: ApplyPointersParams) {\n const setModelPointerImpl = setModelPointerFn ?? setModelPointer\n const setAllPointersImpl = setAllPointersToModelFn ?? setAllPointersToModel\n\n // Always set the main model pointer to the newly added model\n // This ensures the user immediately starts using the model they just configured\n setModelPointerImpl('main', modelId)\n\n // Handle additional pointer assignments\n if (isOnboarding) {\n // First-time setup: set all pointers to this model\n setAllPointersImpl(modelId)\n } else if (targetPointer && targetPointer !== 'main') {\n // Specific pointer configuration: also set target pointer\n setModelPointerImpl(targetPointer, modelId)\n }\n}\n", "import OpenAI from 'openai'\n\nimport models, { providers } from '#core/constants/models'\nimport type { ProviderType } from '#core/utils/config'\nimport { logError } from '#core/utils/log'\n\nimport type { ModelInfo } from '../types'\n\ntype Params = {\n selectedProvider: ProviderType\n apiKey: string\n providerBaseUrl: string\n customBaseUrl: string\n modelFetchers: any\n setIsLoadingModels: (isLoading: boolean) => void\n setModelLoadError: (error: string | null) => void\n setAvailableModels: (models: ModelInfo[]) => void\n navigateTo: (screen: 'model' | 'modelInput') => void\n}\n\nexport async function fetchModelsForProvider({\n selectedProvider,\n apiKey,\n providerBaseUrl,\n customBaseUrl,\n modelFetchers,\n setIsLoadingModels,\n setModelLoadError,\n setAvailableModels,\n navigateTo,\n}: Params): Promise<ModelInfo[]> {\n setIsLoadingModels(true)\n setModelLoadError(null)\n\n try {\n // For Anthropic provider (including official and community proxies via sub-menu), use the same logic\n if (selectedProvider === 'anthropic') {\n const anthropicModels =\n await modelFetchers.fetchAnthropicCompatibleProviderModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(anthropicModels)\n navigateTo('model')\n return anthropicModels\n }\n\n // For custom OpenAI-compatible APIs, use the fetchCustomOpenAIModels function\n if (selectedProvider === 'custom-openai') {\n const customModels = await modelFetchers.fetchCustomOpenAIModels({\n apiKey,\n customBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(customModels)\n navigateTo('model')\n return customModels\n }\n\n // For Gemini, use the separate fetchGeminiModels function\n if (selectedProvider === 'gemini') {\n const geminiModels = await modelFetchers.fetchGeminiModels({\n apiKey,\n setModelLoadError,\n })\n setAvailableModels(geminiModels)\n navigateTo('model')\n return geminiModels\n }\n\n // For Kimi, use the fetchKimiModels function\n if (selectedProvider === 'kimi') {\n const kimiModels = await modelFetchers.fetchKimiModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(kimiModels)\n navigateTo('model')\n return kimiModels\n }\n\n // For DeepSeek, use the fetchDeepSeekModels function\n if (selectedProvider === 'deepseek') {\n const deepseekModels = await modelFetchers.fetchDeepSeekModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(deepseekModels)\n navigateTo('model')\n return deepseekModels\n }\n\n // For SiliconFlow, use the fetchSiliconFlowModels function\n if (selectedProvider === 'siliconflow') {\n const siliconflowModels = await modelFetchers.fetchSiliconFlowModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(siliconflowModels)\n navigateTo('model')\n return siliconflowModels\n }\n\n // For Qwen, use the fetchQwenModels function\n if (selectedProvider === 'qwen') {\n const qwenModels = await modelFetchers.fetchQwenModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(qwenModels)\n navigateTo('model')\n return qwenModels\n }\n\n // For GLM, use the fetchGLMModels function\n if (selectedProvider === 'glm') {\n const glmModels = await modelFetchers.fetchGLMModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(glmModels)\n navigateTo('model')\n return glmModels\n }\n\n // For Baidu Qianfan, use the fetchBaiduQianfanModels function\n if (selectedProvider === 'baidu-qianfan') {\n const baiduModels = await modelFetchers.fetchBaiduQianfanModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n })\n setAvailableModels(baiduModels)\n navigateTo('model')\n return baiduModels\n }\n\n // For Azure, skip model fetching and go directly to model input\n if (selectedProvider === 'azure') {\n navigateTo('modelInput')\n return []\n }\n\n // For all other providers, use the OpenAI client\n let baseURL = providerBaseUrl || providers[selectedProvider]?.baseURL\n\n // For custom-openai provider, use the custom base URL\n if (selectedProvider === 'custom-openai') {\n baseURL = customBaseUrl\n }\n\n const openai = new OpenAI({\n apiKey: apiKey || 'dummy-key-for-ollama', // Ollama doesn't need a real key\n baseURL: baseURL,\n dangerouslyAllowBrowser: true,\n })\n\n // Fetch the models\n const response = await openai.models.list()\n\n // Transform the response into our ModelInfo format\n const fetchedModels = []\n for (const model of response.data) {\n const record = model as unknown as Record<string, unknown>\n const modelName =\n (typeof record.modelName === 'string' && record.modelName) ||\n (typeof record.id === 'string' && record.id) ||\n (typeof record.name === 'string' && record.name) ||\n (typeof record.model === 'string' && record.model) ||\n 'unknown'\n const modelInfo = models[selectedProvider as keyof typeof models]?.find(\n m => m.model === modelName,\n )\n fetchedModels.push({\n model: modelName,\n provider: selectedProvider,\n max_tokens: modelInfo?.max_output_tokens,\n supports_vision: modelInfo?.supports_vision || false,\n supports_function_calling:\n modelInfo?.supports_function_calling || false,\n supports_reasoning_effort:\n modelInfo?.supports_reasoning_effort || false,\n })\n }\n\n setAvailableModels(fetchedModels)\n\n // Navigate to model selection screen if models were loaded successfully\n navigateTo('model')\n\n return fetchedModels\n } catch (error) {\n logError(error)\n\n // Re-throw the error so that fetchModelsWithRetry can handle it properly\n throw error\n } finally {\n setIsLoadingModels(false)\n }\n}\n", "export { fetchAnthropicCompatibleProviderModels } from './modelFetchers/anthropic'\nexport { fetchBaiduQianfanModels } from './modelFetchers/baiduQianfan'\nexport { fetchCustomOpenAIModels } from './modelFetchers/customOpenAI'\nexport { fetchDeepSeekModels } from './modelFetchers/deepseek'\nexport { fetchGeminiModels } from './modelFetchers/gemini'\nexport { fetchGLMModels } from './modelFetchers/glm'\nexport { fetchKimiModels } from './modelFetchers/kimi'\nexport { fetchMinimaxModels } from './modelFetchers/minimax'\nexport { fetchQwenModels } from './modelFetchers/qwen'\nexport { fetchSiliconFlowModels } from './modelFetchers/siliconflow'\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nasync function fetchAnthropicModels(baseURL: string, apiKey: string) {\n try {\n const response = await fetch(`${baseURL}/v1/models`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error(\n 'Invalid API key. Please check your API key and try again.',\n )\n } else if (response.status === 403) {\n throw new Error('API key does not have permission to access models.')\n } else if (response.status === 404) {\n throw new Error(\n 'API endpoint not found. This provider may not support model listing.',\n )\n } else if (response.status === 429) {\n throw new Error(\n 'Too many requests. Please wait a moment and try again.',\n )\n } else if (response.status >= 500) {\n throw new Error(\n 'API service is temporarily unavailable. Please try again later.',\n )\n } else {\n throw new Error(`Unable to connect to API (${response.status}).`)\n }\n }\n\n const data = await response.json()\n\n let models = []\n if (data && data.data && Array.isArray(data.data)) {\n models = data.data\n } else if (Array.isArray(data)) {\n models = data\n } else if (data && data.models && Array.isArray(data.models)) {\n models = data.models\n } else {\n throw new Error('API returned unexpected response format.')\n }\n\n return models\n } catch (error) {\n if (\n error instanceof Error &&\n (error.message.includes('API key') ||\n error.message.includes('API endpoint') ||\n error.message.includes('API service') ||\n error.message.includes('response format'))\n ) {\n throw error\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new Error(\n 'Unable to connect to the API. Please check the base URL and your internet connection.',\n )\n }\n\n throw new Error(\n 'Failed to fetch models from API. Please check your configuration and try again.',\n )\n }\n}\n\n// \u901A\u7528\u7684Anthropic\u517C\u5BB9\u6A21\u578B\u83B7\u53D6\u51FD\u6570\uFF0C\u5B9E\u73B0\u4E09\u5C42\u964D\u7EA7\u7B56\u7565\nasync function fetchAnthropicCompatibleModelsWithFallback({\n baseURL,\n provider,\n apiKey,\n apiKeyUrl,\n setModelLoadError,\n}: {\n baseURL: string\n provider: string\n apiKey: string\n apiKeyUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n let lastError: Error | null = null\n\n // \u7B2C\u4E00\u5C42\uFF1A\u5C1D\u8BD5\u4F7F\u7528 Anthropic \u98CE\u683C\u7684 API\n try {\n const models = await fetchAnthropicModels(baseURL, apiKey)\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: provider,\n max_tokens: model.max_tokens || 8192,\n supports_vision: model.supports_vision || true,\n supports_function_calling: model.supports_function_calling || true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n lastError = error as Error\n debugLogger.warn('MODEL_FETCH_NATIVE_API_FAILED', {\n provider,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n\n // \u7B2C\u4E8C\u5C42\uFF1A\u5C1D\u8BD5\u4F7F\u7528 OpenAI \u98CE\u683C\u7684 API\n try {\n const models = await fetchCustomModels(baseURL, apiKey)\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: provider,\n max_tokens: model.max_tokens || 8192,\n supports_vision: model.supports_vision || false,\n supports_function_calling: model.supports_function_calling || true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n lastError = error as Error\n debugLogger.warn('MODEL_FETCH_OPENAI_API_FAILED', {\n provider,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n\n // \u7B2C\u4E09\u5C42\uFF1A\u964D\u7EA7\u5230\u624B\u52A8\u8F93\u5165\u6A21\u5F0F\n let errorMessage = `Failed to fetch ${provider} models using both native and OpenAI-compatible API formats`\n if (lastError instanceof Error) {\n errorMessage = lastError.message\n }\n\n // \u6DFB\u52A0\u6709\u7528\u7684\u5EFA\u8BAE\n if (errorMessage.includes('API key')) {\n errorMessage += apiKeyUrl\n ? `\\n\\n\uD83D\uDCA1 Tip: Get your API key from ${apiKeyUrl}`\n : '\\n\\n\uD83D\uDCA1 Tip: Check that your API key is set and valid for this provider'\n } else if (errorMessage.includes('permission')) {\n errorMessage += `\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the ${provider} API`\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw new Error(errorMessage)\n}\n\nexport async function fetchAnthropicCompatibleProviderModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n // For anthropic, use defaults\n const defaultBaseURL = 'https://api.anthropic.com'\n const apiKeyUrl = ''\n const actualProvider = 'anthropic'\n const baseURL = providerBaseUrl || defaultBaseURL\n return fetchAnthropicCompatibleModelsWithFallback({\n baseURL,\n provider: actualProvider,\n apiKey,\n apiKeyUrl,\n setModelLoadError,\n })\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchBaiduQianfanModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://qianfan.baidubce.com/v2'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'baidu-qianfan',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch Baidu Qianfan models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://console.bce.baidu.com/iam/#/iam/accesslist'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Baidu Qianfan API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchCustomOpenAIModels({\n apiKey,\n customBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n customBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const models = await fetchCustomModels(customBaseUrl, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'custom-openai',\n max_tokens: model.max_tokens || 4096,\n supports_vision: false, // Default to false, could be enhanced\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch custom API models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n // Add helpful suggestions based on error type\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Check that your API key is valid for this endpoint'\n } else if (errorMessage.includes('endpoint not found')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure the base URL ends with /v1 and supports OpenAI-compatible API'\n } else if (errorMessage.includes('connect')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Verify the base URL is correct and accessible'\n } else if (errorMessage.includes('response format')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: This API may not be fully OpenAI-compatible'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchDeepSeekModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://api.deepseek.com'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'deepseek',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false, // Default to false, could be enhanced\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch DeepSeek models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n // Add helpful suggestions based on error type\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://platform.deepseek.com/api_keys'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the DeepSeek API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchGeminiModels({\n apiKey,\n setModelLoadError,\n}: {\n apiKey: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`,\n )\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(\n errorData.error?.message || `API error: ${response.status}`,\n )\n }\n\n const { models } = await response.json()\n\n return models\n .filter((model: any) =>\n model.supportedGenerationMethods.includes('generateContent'),\n )\n .map((model: any) => ({\n model: model.name.replace('models/', ''),\n provider: 'gemini',\n max_tokens: model.outputTokenLimit,\n supports_vision:\n model.supportedGenerationMethods.includes('generateContent'),\n supports_function_calling:\n model.supportedGenerationMethods.includes('generateContent'),\n }))\n } catch (error) {\n setModelLoadError(error instanceof Error ? error.message : 'Unknown error')\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchGLMModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://open.bigmodel.cn/api/paas/v4'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'glm',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch GLM models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://open.bigmodel.cn (API Keys section)'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the GLM API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchKimiModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://api.moonshot.cn/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'kimi',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false, // Default to false, could be enhanced\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch Kimi models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n // Add helpful suggestions based on error type\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://platform.moonshot.cn/console/api-keys'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Kimi API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchMinimaxModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://api.minimaxi.com/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'minimax',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch MiniMax models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://www.minimax.io/platform/user-center/basic-information'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the MiniMax API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchQwenModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL =\n providerBaseUrl || 'https://dashscope.aliyuncs.com/compatible-mode/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'qwen',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch Qwen models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://bailian.console.aliyun.com/?tab=model#/api-key'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the Qwen API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { fetchCustomModels } from '#core/ai/openai'\nimport type { ModelInfo } from '../types'\n\ntype SetModelLoadError = (message: string) => void\n\nexport async function fetchSiliconFlowModels({\n apiKey,\n providerBaseUrl,\n setModelLoadError,\n}: {\n apiKey: string\n providerBaseUrl: string\n setModelLoadError: SetModelLoadError\n}): Promise<ModelInfo[]> {\n try {\n const baseURL = providerBaseUrl || 'https://api.siliconflow.cn/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n return models.map((model: any) => ({\n model:\n model.modelName || model.id || model.name || model.model || 'unknown',\n provider: 'siliconflow',\n max_tokens: model.max_tokens || 8192,\n supports_vision: false, // Default to false, could be enhanced\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n } catch (error) {\n let errorMessage = 'Failed to fetch SiliconFlow models'\n\n if (error instanceof Error) {\n errorMessage = error.message\n }\n\n // Add helpful suggestions based on error type\n if (errorMessage.includes('API key')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Get your API key from https://cloud.siliconflow.cn/i/oJWsm6io'\n } else if (errorMessage.includes('permission')) {\n errorMessage +=\n '\\n\\n\uD83D\uDCA1 Tip: Make sure your API key has access to the SiliconFlow API'\n } else if (errorMessage.includes('connection')) {\n errorMessage += '\\n\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n}\n", "import { DEFAULT_MAX_TOKENS } from './flow/options'\nimport type { ModelInfo } from './flow/types'\nimport { logError } from '#core/utils/log'\n\ntype JsonObject = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction getNestedValue(value: unknown, path: string[]): unknown {\n let current: unknown = value\n for (const key of path) {\n if (!isRecord(current)) return undefined\n current = current[key]\n }\n return current\n}\n\nfunction toPositiveFiniteNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value > 0\n ? value\n : null\n}\n\nexport async function fetchOllamaModels(args: {\n ollamaBaseUrl: string\n setAvailableModels: (models: ModelInfo[]) => void\n setModelLoadError: (error: string | null) => void\n navigateTo: (screen: 'model') => void\n}): Promise<ModelInfo[]> {\n try {\n const response = await fetch(`${args.ollamaBaseUrl}/models`)\n\n if (!response.ok) {\n throw new Error(`HTTP error ${response.status}: ${response.statusText}`)\n }\n\n const responseData = await response.json()\n\n let models: unknown[] = []\n\n if (isRecord(responseData) && Array.isArray(responseData.data)) {\n models = responseData.data\n } else if (isRecord(responseData) && Array.isArray(responseData.models)) {\n models = responseData.models\n } else if (Array.isArray(responseData)) {\n models = responseData\n } else {\n throw new Error('Invalid response from Ollama API: missing models array')\n }\n\n const getModelName = (model: unknown): string => {\n if (typeof model === 'string') return model\n if (!isRecord(model)) return ''\n\n const candidates = [\n model.id,\n model.name,\n model.modelName,\n model.model,\n model.model_name,\n ]\n for (const c of candidates) {\n if (typeof c === 'string') return c\n }\n return ''\n }\n\n const ollamaModels: ModelInfo[] = models.map(model => ({\n model: getModelName(model),\n provider: 'ollama',\n max_tokens: DEFAULT_MAX_TOKENS,\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n\n const validModels = ollamaModels.filter(model => model.model)\n\n const normalizeOllamaRoot = (url: string): string => {\n try {\n const u = new URL(url)\n let pathname = u.pathname.replace(/\\/+$/g, '').replace(/^$/, '')\n if (pathname.endsWith('/v1')) {\n pathname = pathname.slice(0, -3)\n }\n u.pathname = pathname\n return u.toString().replace(/\\/+$/g, '')\n } catch {\n return url.replace(/\\/v1\\/?$/g, '')\n }\n }\n\n const extractContextTokens = (data: unknown): number | null => {\n if (!isRecord(data)) return null\n\n const modelInfoValue = data.model_info\n if (isRecord(modelInfoValue)) {\n for (const key of Object.keys(modelInfoValue)) {\n if (\n key.endsWith('.context_length') ||\n key.endsWith('_context_length')\n ) {\n const val = toPositiveFiniteNumber(modelInfoValue[key])\n if (val) return val\n }\n }\n }\n\n const paths: string[][] = [\n ['parameters', 'num_ctx'],\n ['model_info', 'num_ctx'],\n ['config', 'num_ctx'],\n ['details', 'context_length'],\n ['context_length'],\n ['num_ctx'],\n ['max_tokens'],\n ['max_new_tokens'],\n ]\n\n const candidates = paths\n .map(path => toPositiveFiniteNumber(getNestedValue(data, path)))\n .filter((v): v is number => typeof v === 'number')\n\n if (candidates.length > 0) return Math.max(...candidates)\n\n const parametersValue = getNestedValue(data, ['parameters'])\n if (typeof parametersValue === 'string') {\n const m = parametersValue.match(/num_ctx\\s*[:=]\\s*(\\d+)/i)\n if (!m) return null\n const n = parseInt(m[1], 10)\n return Number.isFinite(n) && n > 0 ? n : null\n }\n return null\n }\n\n const ollamaRoot = normalizeOllamaRoot(args.ollamaBaseUrl)\n const enrichedModels = await Promise.all(\n validModels.map(async m => {\n try {\n const showResp = await fetch(`${ollamaRoot}/api/show`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name: m.model }),\n })\n if (showResp.ok) {\n const showData = await showResp.json()\n const ctx = extractContextTokens(showData)\n if (typeof ctx === 'number' && isFinite(ctx) && ctx > 0) {\n return { ...m, context_length: ctx }\n }\n }\n return m\n } catch {\n return m\n }\n }),\n )\n\n args.setAvailableModels(enrichedModels)\n\n if (enrichedModels.length > 0) {\n args.navigateTo('model')\n } else {\n args.setModelLoadError('No models found in your Ollama installation')\n }\n\n return enrichedModels\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n if (errorMessage.includes('fetch')) {\n args.setModelLoadError(\n `Could not connect to Ollama server at ${args.ollamaBaseUrl}. Make sure Ollama is running and the URL is correct.`,\n )\n } else {\n args.setModelLoadError(`Error loading Ollama models: ${errorMessage}`)\n }\n\n logError(error)\n return []\n }\n}\n", "import { debug as debugLogger } from '#core/utils/debugLogger'\nimport { fetchModelsForProvider } from './flow/actions/fetchModels'\nimport {\n CONTEXT_LENGTH_OPTIONS,\n DEFAULT_CONTEXT_LENGTH,\n DEFAULT_MAX_TOKENS,\n MAX_TOKENS_OPTIONS,\n REASONING_EFFORT_OPTIONS,\n REQUEST_STRATEGY_OPTIONS,\n} from './flow/options'\nimport type { ModelInfo } from './flow/types'\nimport * as modelFetchers from './flow/modelFetchers'\nimport { logError } from '#core/utils/log'\nimport { fetchOllamaModels } from './fetchOllamaModels'\nimport type { ModelSelectorState } from './useModelSelectorState'\nimport type { ModelParamsField } from './viewTypes'\n\nexport function useModelSelectorModelFlow(state: ModelSelectorState) {\n function summarizeErrorMessage(message: string): string {\n const normalized = message.replace(/\\s+/g, ' ').trim()\n const htmlIndex = normalized.toLowerCase().indexOf('<html')\n const trimmed =\n htmlIndex >= 0 ? normalized.slice(0, htmlIndex).trim() : normalized\n if (!trimmed) return 'Unknown error'\n return trimmed.length > 240 ? `${trimmed.slice(0, 240)}\u2026` : trimmed\n }\n\n async function fetchModels(): Promise<ModelInfo[]> {\n return await fetchModelsForProvider({\n selectedProvider: state.selectedProvider,\n apiKey: state.apiKey,\n providerBaseUrl: state.providerBaseUrl,\n customBaseUrl: state.customBaseUrl,\n modelFetchers,\n setIsLoadingModels: state.setIsLoadingModels,\n setModelLoadError: state.setModelLoadError,\n setAvailableModels: state.setAvailableModels,\n navigateTo: state.navigateTo,\n })\n }\n\n async function fetchModelsWithRetry(): Promise<ModelInfo[]> {\n const MAX_RETRIES = 2\n let lastError: Error | null = null\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n state.setFetchRetryCount(attempt)\n state.setIsRetrying(attempt > 1)\n\n if (attempt > 1) {\n state.setModelLoadError(\n `Attempt ${attempt}/${MAX_RETRIES}: Retrying model discovery...`,\n )\n await new Promise(resolve => setTimeout(resolve, 1000))\n }\n\n try {\n const models = await fetchModels()\n state.setFetchRetryCount(0)\n state.setIsRetrying(false)\n state.setModelLoadError(null)\n return models\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n debugLogger.warn('MODEL_FETCH_RETRY_FAILED', {\n attempt,\n maxRetries: MAX_RETRIES,\n error: lastError.message,\n provider: state.selectedProvider,\n })\n\n if (attempt === MAX_RETRIES) break\n }\n }\n\n state.setIsRetrying(false)\n const errorMessage = summarizeErrorMessage(lastError?.message || '')\n\n state.setModelLoadError(\n `Failed to validate API key after ${MAX_RETRIES} attempts: ${errorMessage}`,\n )\n throw new Error(`API key validation failed: ${errorMessage}`)\n }\n\n async function handleApiKeySubmit(key: string) {\n const cleanedKey = key.replace(/\\s+/g, '').trim()\n state.setApiKey(cleanedKey)\n state.setModelLoadError(null)\n\n if (state.selectedProvider === 'azure') {\n state.navigateTo('resourceName')\n return\n }\n\n if (\n state.selectedProvider === 'minimax' ||\n state.selectedProvider === 'minimax-coding'\n ) {\n state.navigateTo('modelInput')\n return\n }\n\n try {\n state.setIsLoadingModels(true)\n const models = await fetchModelsWithRetry()\n if (models.length === 0) {\n state.navigateTo('modelInput')\n }\n } catch (error) {\n logError(error)\n } finally {\n state.setIsLoadingModels(false)\n }\n }\n\n function handleResourceNameSubmit(name: string) {\n state.setResourceName(name)\n state.navigateTo('modelInput')\n }\n\n function handleCustomBaseUrlSubmit(url: string) {\n const cleanUrl = url.replace(/\\/+$/, '')\n state.setCustomBaseUrl(cleanUrl)\n state.navigateTo('apiKey')\n }\n\n function handleProviderBaseUrlSubmit(url: string) {\n const cleanUrl = url.replace(/\\/+$/, '')\n state.setProviderBaseUrl(cleanUrl)\n\n if (state.selectedProvider === 'ollama') {\n state.setOllamaBaseUrl(cleanUrl)\n state.setIsLoadingModels(true)\n state.setModelLoadError(null)\n\n fetchOllamaModels({\n ollamaBaseUrl: cleanUrl,\n setAvailableModels: state.setAvailableModels,\n setModelLoadError: state.setModelLoadError,\n navigateTo: () => state.navigateTo('model'),\n }).finally(() => {\n state.setIsLoadingModels(false)\n })\n } else {\n state.navigateTo('apiKey')\n }\n }\n\n function handleCustomModelSubmit(model: string) {\n state.setCustomModelName(model)\n state.setSelectedModel(model)\n state.setSupportsReasoningEffort(false)\n state.setReasoningEffort(null)\n\n state.setMaxTokensMode('preset')\n state.setSelectedMaxTokensPreset(DEFAULT_MAX_TOKENS)\n state.setMaxTokens(DEFAULT_MAX_TOKENS.toString())\n state.setMaxTokensCursorOffset(DEFAULT_MAX_TOKENS.toString().length)\n\n state.navigateTo('modelParams')\n state.setActiveFieldIndex(0)\n }\n\n function handleModelSelection(model: string) {\n state.setSelectedModel(model)\n\n const modelInfo = state.availableModels.find(m => m.model === model)\n state.setSupportsReasoningEffort(\n Boolean(modelInfo?.supports_reasoning_effort),\n )\n\n if (!modelInfo?.supports_reasoning_effort) {\n state.setReasoningEffort(null)\n }\n\n state.setContextLength(modelInfo?.context_length ?? DEFAULT_CONTEXT_LENGTH)\n\n const modelMaxTokens = modelInfo?.max_tokens\n if (typeof modelMaxTokens === 'number' && Number.isFinite(modelMaxTokens)) {\n const matchingPreset = MAX_TOKENS_OPTIONS.find(\n option => option.value === modelMaxTokens,\n )\n\n if (matchingPreset) {\n state.setMaxTokensMode('preset')\n state.setSelectedMaxTokensPreset(modelMaxTokens)\n state.setMaxTokens(modelMaxTokens.toString())\n } else {\n state.setMaxTokensMode('custom')\n state.setMaxTokens(modelMaxTokens.toString())\n }\n state.setMaxTokensCursorOffset(modelMaxTokens.toString().length)\n } else {\n state.setMaxTokensMode('preset')\n state.setSelectedMaxTokensPreset(DEFAULT_MAX_TOKENS)\n state.setMaxTokens(DEFAULT_MAX_TOKENS.toString())\n state.setMaxTokensCursorOffset(DEFAULT_MAX_TOKENS.toString().length)\n }\n\n state.navigateTo('modelParams')\n state.setActiveFieldIndex(0)\n }\n\n const handleModelParamsSubmit = () => {\n if (\n !CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === state.contextLength)\n ) {\n state.setContextLength(DEFAULT_CONTEXT_LENGTH)\n }\n state.navigateTo('contextLength')\n }\n\n const getFormFieldsForModelParams = (): ModelParamsField[] => {\n const fields: ModelParamsField[] = [\n {\n name: 'maxTokens',\n label: 'Maximum Tokens',\n description: 'Select the maximum number of tokens to generate.',\n component: 'select',\n options: MAX_TOKENS_OPTIONS.map(option => ({\n label: option.label,\n value: option.value.toString(),\n })),\n defaultValue: state.maxTokens,\n },\n ]\n\n if (state.supportsReasoningEffort) {\n fields.push({\n name: 'reasoningEffort',\n label: 'Reasoning Effort',\n description: 'Controls reasoning depth for complex problems.',\n component: 'select',\n })\n }\n\n if (state.selectedModel.toLowerCase().includes('claude')) {\n fields.push({\n name: 'requestStrategy',\n label: 'Request Strategy',\n description:\n 'Choose how Kode should try compatibility request profiles if a provider blocks third-party clients.',\n component: 'select',\n options: REQUEST_STRATEGY_OPTIONS.map(option => ({\n label: option.label,\n value: option.value,\n })),\n defaultValue: state.requestStrategy,\n })\n }\n\n fields.push({ name: 'submit', label: 'Continue \u2192', component: 'button' })\n return fields\n }\n\n const reasoningEffortOptions = REASONING_EFFORT_OPTIONS\n const requestStrategyOptions = REQUEST_STRATEGY_OPTIONS\n const handleContextLengthSubmit = () => state.navigateTo('connectionTest')\n\n return {\n fetchModelsWithRetry,\n handleApiKeySubmit,\n handleResourceNameSubmit,\n handleCustomBaseUrlSubmit,\n handleProviderBaseUrlSubmit,\n handleCustomModelSubmit,\n handleModelSelection,\n handleModelParamsSubmit,\n getFormFieldsForModelParams,\n reasoningEffortOptions,\n requestStrategyOptions,\n handleContextLengthSubmit,\n }\n}\n\nexport type ModelSelectorModelFlow = ReturnType<\n typeof useModelSelectorModelFlow\n>\n", "import type { ModelSelectorState } from './useModelSelectorState'\nimport { useCallback, useEffect, useRef } from 'react'\n\nexport function useModelSelectorTextHandlers(state: ModelSelectorState) {\n const cleanedNotificationTimeoutRef = useRef<ReturnType<\n typeof setTimeout\n > | null>(null)\n\n useEffect(() => {\n return () => {\n if (cleanedNotificationTimeoutRef.current) {\n clearTimeout(cleanedNotificationTimeoutRef.current)\n }\n }\n }, [])\n\n const scheduleCleanedNotificationClear = useCallback(() => {\n if (cleanedNotificationTimeoutRef.current) {\n clearTimeout(cleanedNotificationTimeoutRef.current)\n }\n cleanedNotificationTimeoutRef.current = setTimeout(() => {\n cleanedNotificationTimeoutRef.current = null\n state.setApiKeyCleanedNotification(false)\n }, 3000)\n }, [state.setApiKeyCleanedNotification])\n\n function handleCursorOffsetChange(offset: number) {\n state.setCursorOffset(offset)\n }\n\n function formatApiKeyDisplay(key: string): string {\n if (!key) return ''\n if (key.length <= 10) return '*'.repeat(key.length)\n\n const prefix = key.slice(0, 4)\n const suffix = key.slice(-4)\n return `${prefix}***${suffix}`\n }\n\n function handleApiKeyChange(value: string) {\n state.setApiKeyEdited(true)\n // API keys should not contain whitespace. Remove spaces/newlines introduced by\n // terminal wrapping, copy/paste formatting, or legacy paste behavior.\n const cleanedValue = value.replace(/\\s+/g, '').trim()\n\n if (value !== cleanedValue && value.length > 0) {\n state.setApiKeyCleanedNotification(true)\n scheduleCleanedNotificationClear()\n }\n\n state.setApiKey(cleanedValue)\n state.setCursorOffset(cleanedValue.length)\n }\n\n function handleModelSearchChange(value: string) {\n state.setModelSearchQuery(value)\n state.setModelSearchCursorOffset(value.length)\n }\n\n function handleModelSearchCursorOffsetChange(offset: number) {\n state.setModelSearchCursorOffset(offset)\n }\n\n return {\n handleCursorOffsetChange,\n formatApiKeyDisplay,\n handleApiKeyChange,\n handleModelSearchChange,\n handleModelSearchCursorOffsetChange,\n }\n}\n\nexport type ModelSelectorTextHandlers = ReturnType<\n typeof useModelSelectorTextHandlers\n>\n", "import type { ProviderType } from '#core/utils/config'\nimport { logError } from '#core/utils/log'\nimport { runConnectionTestFlow } from './flow/actions/connectionTest'\nimport { handleProviderSelection as handleProviderSelectionAction } from './flow/actions/providerSelection'\nimport {\n applyPointersForNewModel,\n saveModelConfiguration,\n} from './flow/actions/saveConfiguration'\nimport { handleBackNavigation } from './flow/state'\nimport type { ModelSelectorProps } from './types'\nimport type { ModelSelectorState } from './useModelSelectorState'\nimport { useModelSelectorModelFlow } from './useModelSelectorModelFlow'\nimport { useModelSelectorTextHandlers } from './useModelSelectorTextHandlers'\n\ntype Args = {\n props: ModelSelectorProps\n state: ModelSelectorState\n onDone: () => void\n}\n\nexport function useModelSelectorActions({ props, state, onDone }: Args) {\n const modelFlow = useModelSelectorModelFlow(state)\n const textHandlers = useModelSelectorTextHandlers(state)\n\n async function saveConfiguration(\n provider: ProviderType,\n model: string,\n ): Promise<string | null> {\n try {\n return await saveModelConfiguration({\n provider,\n model,\n providerBaseUrl: state.providerBaseUrl,\n resourceName: state.resourceName,\n customBaseUrl: state.customBaseUrl,\n apiKey: state.apiKey,\n maxTokens: state.maxTokens,\n contextLength: state.contextLength,\n reasoningEffort: state.reasoningEffort ?? undefined,\n requestStrategy: state.requestStrategy,\n })\n } catch (error) {\n state.setValidationError(\n error instanceof Error ? error.message : 'Failed to add model',\n )\n return null\n }\n }\n\n async function handleConfirmation(): Promise<void> {\n state.setValidationError(null)\n const modelId = await saveConfiguration(\n state.selectedProvider,\n state.selectedModel,\n )\n if (!modelId) return\n\n try {\n applyPointersForNewModel({\n modelId,\n isOnboarding: Boolean(props.isOnboarding),\n targetPointer: props.targetPointer,\n })\n } catch (error) {\n state.setValidationError(\n error instanceof Error\n ? error.message\n : 'Failed to update model pointers',\n )\n return\n }\n\n onDone()\n }\n\n const handleBack = () => {\n const { stack: nextStack, effect } = handleBackNavigation(state.screenStack)\n\n if (effect?.type === 'resetProviderFocus') {\n state.setProviderFocusIndex(0)\n }\n\n if (effect?.type === 'exit') {\n if (props.onCancel) props.onCancel()\n else onDone()\n return\n }\n\n if (nextStack !== state.screenStack) {\n state.setScreenStack(nextStack)\n }\n }\n\n async function handleProviderSelection(provider: string) {\n const isProviderMenu =\n provider === 'partnerProviders' || provider === 'partnerCodingPlans'\n\n if (!isProviderMenu) {\n state.setApiKeyEdited(false)\n state.setApiKey('')\n state.setCursorOffset(0)\n state.setApiKeyCleanedNotification(false)\n state.setModelLoadError(null)\n state.setAvailableModels([])\n state.setSelectedModel('')\n state.setValidationError(null)\n }\n\n try {\n await handleProviderSelectionAction(provider, {\n navigateTo: state.navigateTo,\n setPartnerProviderFocusIndex: state.setPartnerProviderFocusIndex,\n setCodingPlanFocusIndex: state.setCodingPlanFocusIndex,\n setSelectedProvider: state.setSelectedProvider,\n setProviderBaseUrl: state.setProviderBaseUrl,\n saveConfiguration,\n onDone,\n selectedModel: state.selectedModel,\n })\n } catch (error) {\n logError(error)\n state.setValidationError(\n error instanceof Error ? error.message : 'Failed to select provider',\n )\n }\n }\n\n async function handleConnectionTest() {\n state.setIsTestingConnection(true)\n state.setConnectionTestResult(null)\n\n try {\n const result = await runConnectionTestFlow({\n params: {\n selectedProvider: state.selectedProvider,\n selectedModel: state.selectedModel,\n apiKey: state.apiKey,\n maxTokens: state.maxTokens,\n providerBaseUrl: state.providerBaseUrl,\n customBaseUrl: state.customBaseUrl,\n resourceName: state.resourceName,\n requestStrategy: state.requestStrategy,\n },\n navigateTo: () => state.navigateTo('confirmation'),\n onProgress: progress => state.setConnectionTestResult(progress),\n })\n state.setConnectionTestResult(result)\n } finally {\n state.setIsTestingConnection(false)\n }\n }\n\n return {\n handleBack,\n handleProviderSelection,\n ...modelFlow,\n handleConnectionTest,\n handleConfirmation,\n ...textHandlers,\n }\n}\n\nexport type ModelSelectorActions = ReturnType<typeof useModelSelectorActions>\n", "import { useRef } from 'react'\nimport { useKeypress } from '#ui-ink/hooks/useKeypress'\n\nexport function useEscapeNavigation(\n onEscape: () => void,\n _abortController?: AbortController,\n) {\n const handledRef = useRef(false)\n\n useKeypress(\n (_input, key) => {\n if (key.escape && !handledRef.current) {\n handledRef.current = true\n setTimeout(() => {\n handledRef.current = false\n }, 100)\n onEscape()\n return true\n }\n },\n { isActive: true },\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "line", "start", "hiddenAbove", "hiddenBelow", "currentCursor", "React", "onMessage", "Box", "Text", "React", "Text", "React", "isFocused", "isSelected", "React", "Text", "useState", "useState", "React", "Box", "Text", "React", "useState", "Box", "Text", "Box", "Text", "React", "useMemo", "useMemo", "Box", "Text", "code", "type", "line", "React", "React", "Box", "Text", "figures", "React", "Box", "Text", "React", "Text", "Box", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Text", "VIEWPORT_SAFE_MARGIN_ROWS", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "React", "Box", "Text", "React", "Box", "Text", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "React", "Box", "Newline", "Text", "React", "Box", "Text", "Newline", "VIEWPORT_SAFE_MARGIN_ROWS", "Text", "Box", "figures", "useEffect", "useMemo", "chalk", "chalk", "useEffect", "useMemo", "useMemo", "useEffect", "useMemo", "useMemo", "useState", "useState", "args", "randomUUID", "mkdtemp", "readFile", "rm", "tmpdir", "join", "asRecord", "sleep", "fetchWithTimeout", "buildSystemMessageContent", "mkdtemp", "join", "tmpdir", "randomUUID", "readFile", "rm", "lastError", "fallbackPlan", "useCallback", "useEffect", "useRef", "handleProviderSelection", "useRef", "useRef", "useMemo", "useEffect", "useState", "React", "Box", "Text"]
7
+ }