@shareai-lab/kode 1.2.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (725) hide show
  1. package/README.md +25 -388
  2. package/cli-acp.js +82 -0
  3. package/cli.js +89 -79
  4. package/dist/REPL-GIU4ZIXM.js +42 -0
  5. package/dist/acp-H3VJ77YG.js +1357 -0
  6. package/dist/acp-H3VJ77YG.js.map +7 -0
  7. package/dist/agentsValidate-XP3CFN6F.js +373 -0
  8. package/dist/agentsValidate-XP3CFN6F.js.map +7 -0
  9. package/dist/ask-3G5H5KD5.js +125 -0
  10. package/dist/ask-3G5H5KD5.js.map +7 -0
  11. package/dist/autoUpdater-DNRMJWFQ.js +17 -0
  12. package/dist/chunk-2KWKUXLT.js +490 -0
  13. package/dist/chunk-2KWKUXLT.js.map +7 -0
  14. package/dist/chunk-2PMO2FS2.js +1097 -0
  15. package/dist/chunk-2PMO2FS2.js.map +7 -0
  16. package/dist/chunk-3RUXVV4S.js +23 -0
  17. package/dist/chunk-3RUXVV4S.js.map +7 -0
  18. package/dist/chunk-3TXNP6HH.js +240 -0
  19. package/dist/chunk-3TXNP6HH.js.map +7 -0
  20. package/dist/chunk-4GAIJGRH.js +472 -0
  21. package/dist/chunk-4GAIJGRH.js.map +7 -0
  22. package/dist/chunk-4RTX4AG4.js +249 -0
  23. package/dist/chunk-4RTX4AG4.js.map +7 -0
  24. package/dist/chunk-54DNHKOD.js +511 -0
  25. package/dist/chunk-54DNHKOD.js.map +7 -0
  26. package/dist/chunk-67PY5IX6.js +34 -0
  27. package/dist/chunk-67PY5IX6.js.map +7 -0
  28. package/dist/chunk-6DRDLOLP.js +2613 -0
  29. package/dist/chunk-6DRDLOLP.js.map +7 -0
  30. package/dist/chunk-7CQVZNQV.js +1609 -0
  31. package/dist/chunk-7CQVZNQV.js.map +7 -0
  32. package/dist/chunk-ABLVTESJ.js +19 -0
  33. package/dist/chunk-ABLVTESJ.js.map +7 -0
  34. package/dist/{utils/config.js → chunk-AIMIPK4B.js} +351 -171
  35. package/dist/chunk-AIMIPK4B.js.map +7 -0
  36. package/dist/{utils/autoUpdater.js → chunk-BHGTA6JQ.js} +38 -21
  37. package/dist/chunk-BHGTA6JQ.js.map +7 -0
  38. package/dist/chunk-CIG63V4E.js +72 -0
  39. package/dist/chunk-CIG63V4E.js.map +7 -0
  40. package/dist/chunk-E6YNABER.js +24 -0
  41. package/dist/chunk-E6YNABER.js.map +7 -0
  42. package/dist/chunk-EH34V7CY.js +191 -0
  43. package/dist/chunk-EH34V7CY.js.map +7 -0
  44. package/dist/{cost-tracker.js → chunk-EZXMVTDU.js} +51 -32
  45. package/dist/chunk-EZXMVTDU.js.map +7 -0
  46. package/dist/chunk-FH5CHM6L.js +148 -0
  47. package/dist/chunk-FH5CHM6L.js.map +7 -0
  48. package/dist/chunk-G6I7XROM.js +138 -0
  49. package/dist/chunk-G6I7XROM.js.map +7 -0
  50. package/dist/chunk-HN4E4UUQ.js +96 -0
  51. package/dist/chunk-HN4E4UUQ.js.map +7 -0
  52. package/dist/chunk-HSPVVDIW.js +30198 -0
  53. package/dist/chunk-HSPVVDIW.js.map +7 -0
  54. package/dist/{services/systemReminder.js → chunk-IE2CG2TV.js} +221 -59
  55. package/dist/chunk-IE2CG2TV.js.map +7 -0
  56. package/dist/chunk-JC6NCUG5.js +11 -0
  57. package/dist/chunk-K2MI4TPB.js +1256 -0
  58. package/dist/chunk-K2MI4TPB.js.map +7 -0
  59. package/dist/chunk-KAA5BGMQ.js +12 -0
  60. package/dist/chunk-KAA5BGMQ.js.map +7 -0
  61. package/dist/chunk-MN77D2F7.js +2931 -0
  62. package/dist/chunk-MN77D2F7.js.map +7 -0
  63. package/dist/chunk-NPFOMITO.js +21 -0
  64. package/dist/chunk-NPFOMITO.js.map +7 -0
  65. package/dist/chunk-NQLEUHMS.js +196 -0
  66. package/dist/chunk-NQLEUHMS.js.map +7 -0
  67. package/dist/chunk-OIFQB3S4.js +515 -0
  68. package/dist/chunk-OIFQB3S4.js.map +7 -0
  69. package/dist/chunk-OWTG2W3A.js +164 -0
  70. package/dist/chunk-OWTG2W3A.js.map +7 -0
  71. package/dist/chunk-OZNRLY3E.js +735 -0
  72. package/dist/chunk-OZNRLY3E.js.map +7 -0
  73. package/dist/{utils/debugLogger.js → chunk-QYFKRZQC.js} +107 -204
  74. package/dist/chunk-QYFKRZQC.js.map +7 -0
  75. package/dist/chunk-S3J2TLV6.js +16 -0
  76. package/dist/chunk-S3J2TLV6.js.map +7 -0
  77. package/dist/chunk-S6HRABTA.js +95 -0
  78. package/dist/chunk-S6HRABTA.js.map +7 -0
  79. package/dist/{utils/theme.js → chunk-SDGKPKDK.js} +28 -6
  80. package/dist/chunk-SDGKPKDK.js.map +7 -0
  81. package/dist/chunk-SRZZFAS7.js +766 -0
  82. package/dist/chunk-SRZZFAS7.js.map +7 -0
  83. package/dist/chunk-UKHTVRJM.js +47 -0
  84. package/dist/chunk-UKHTVRJM.js.map +7 -0
  85. package/dist/chunk-UYXEDKOZ.js +24 -0
  86. package/dist/chunk-UYXEDKOZ.js.map +7 -0
  87. package/dist/chunk-VBXVYQYY.js +145 -0
  88. package/dist/chunk-VBXVYQYY.js.map +7 -0
  89. package/dist/chunk-WVHORZQ5.js +17 -0
  90. package/dist/chunk-WVHORZQ5.js.map +7 -0
  91. package/dist/chunk-WWUWDNWW.js +49 -0
  92. package/dist/chunk-WWUWDNWW.js.map +7 -0
  93. package/dist/{utils/model.js → chunk-Z33T5YN5.js} +194 -227
  94. package/dist/chunk-Z33T5YN5.js.map +7 -0
  95. package/dist/{services/openai.js → chunk-ZQU3TXLC.js} +168 -234
  96. package/dist/chunk-ZQU3TXLC.js.map +7 -0
  97. package/dist/cli-SRV2INSL.js +3917 -0
  98. package/dist/cli-SRV2INSL.js.map +7 -0
  99. package/dist/commands-TWH6PGVG.js +46 -0
  100. package/dist/config-6ZMBCL23.js +81 -0
  101. package/dist/context-JQIOOI4W.js +30 -0
  102. package/dist/costTracker-6SL26FDB.js +19 -0
  103. package/dist/customCommands-DNEJS3ZU.js +25 -0
  104. package/dist/customCommands-DNEJS3ZU.js.map +7 -0
  105. package/dist/env-OFAXZ3XG.js +22 -0
  106. package/dist/env-OFAXZ3XG.js.map +7 -0
  107. package/dist/index.js +34 -5
  108. package/dist/index.js.map +4 -4
  109. package/dist/kodeAgentSessionId-X6XWQW7B.js +13 -0
  110. package/dist/kodeAgentSessionId-X6XWQW7B.js.map +7 -0
  111. package/dist/kodeAgentSessionLoad-6N27AC5K.js +18 -0
  112. package/dist/kodeAgentSessionLoad-6N27AC5K.js.map +7 -0
  113. package/dist/kodeAgentSessionResume-HUSAEO24.js +16 -0
  114. package/dist/kodeAgentSessionResume-HUSAEO24.js.map +7 -0
  115. package/dist/kodeAgentStreamJson-NXFN7TXH.js +13 -0
  116. package/dist/kodeAgentStreamJson-NXFN7TXH.js.map +7 -0
  117. package/dist/kodeAgentStreamJsonSession-GRWG3SPE.js +131 -0
  118. package/dist/kodeAgentStreamJsonSession-GRWG3SPE.js.map +7 -0
  119. package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +10 -0
  120. package/dist/kodeAgentStructuredStdio-HGWJT7CU.js.map +7 -0
  121. package/dist/kodeHooks-TDMXFWSO.js +36 -0
  122. package/dist/kodeHooks-TDMXFWSO.js.map +7 -0
  123. package/dist/llm-XVXWYOHK.js +3118 -0
  124. package/dist/llm-XVXWYOHK.js.map +7 -0
  125. package/dist/llmLazy-7TD5N7XP.js +15 -0
  126. package/dist/llmLazy-7TD5N7XP.js.map +7 -0
  127. package/dist/loader-AUXIJTY6.js +28 -0
  128. package/dist/loader-AUXIJTY6.js.map +7 -0
  129. package/dist/mcp-BXJ3K7NZ.js +49 -0
  130. package/dist/mcp-BXJ3K7NZ.js.map +7 -0
  131. package/dist/{services/mentionProcessor.js → mentionProcessor-YD7YXYGF.js} +61 -50
  132. package/dist/mentionProcessor-YD7YXYGF.js.map +7 -0
  133. package/dist/messages-OFUJSPRV.js +63 -0
  134. package/dist/messages-OFUJSPRV.js.map +7 -0
  135. package/dist/model-KPYCXWBK.js +30 -0
  136. package/dist/model-KPYCXWBK.js.map +7 -0
  137. package/dist/openai-5G5D5Q4B.js +29 -0
  138. package/dist/openai-5G5D5Q4B.js.map +7 -0
  139. package/dist/outputStyles-HLDXFQK3.js +28 -0
  140. package/dist/outputStyles-HLDXFQK3.js.map +7 -0
  141. package/dist/package.json +1 -1
  142. package/dist/pluginRuntime-FPTKK6NY.js +218 -0
  143. package/dist/pluginRuntime-FPTKK6NY.js.map +7 -0
  144. package/dist/pluginValidation-DSFXZ4GF.js +17 -0
  145. package/dist/pluginValidation-DSFXZ4GF.js.map +7 -0
  146. package/dist/prompts-LWLAJRS2.js +48 -0
  147. package/dist/prompts-LWLAJRS2.js.map +7 -0
  148. package/dist/query-HVPWL27C.js +50 -0
  149. package/dist/query-HVPWL27C.js.map +7 -0
  150. package/dist/responsesStreaming-AW344PQO.js +10 -0
  151. package/dist/responsesStreaming-AW344PQO.js.map +7 -0
  152. package/dist/ripgrep-YOPCY2GO.js +17 -0
  153. package/dist/ripgrep-YOPCY2GO.js.map +7 -0
  154. package/dist/skillMarketplace-PSNKDINM.js +37 -0
  155. package/dist/skillMarketplace-PSNKDINM.js.map +7 -0
  156. package/dist/state-KNRWP3FO.js +16 -0
  157. package/dist/state-KNRWP3FO.js.map +7 -0
  158. package/dist/theme-7S2QN2FO.js +14 -0
  159. package/dist/theme-7S2QN2FO.js.map +7 -0
  160. package/dist/toolPermissionContext-65L65VEZ.js +17 -0
  161. package/dist/toolPermissionContext-65L65VEZ.js.map +7 -0
  162. package/dist/toolPermissionSettings-GPOBH4IV.js +18 -0
  163. package/dist/toolPermissionSettings-GPOBH4IV.js.map +7 -0
  164. package/dist/tools-FZU2FZBD.js +47 -0
  165. package/dist/tools-FZU2FZBD.js.map +7 -0
  166. package/dist/userInput-VHNBN2MW.js +311 -0
  167. package/dist/userInput-VHNBN2MW.js.map +7 -0
  168. package/dist/uuid-QN2CNKKN.js +9 -0
  169. package/dist/uuid-QN2CNKKN.js.map +7 -0
  170. package/package.json +43 -14
  171. package/scripts/binary-utils.cjs +62 -0
  172. package/scripts/cli-acp-wrapper.cjs +82 -0
  173. package/scripts/cli-wrapper.cjs +105 -0
  174. package/scripts/postinstall.js +135 -9
  175. package/LICENSE +0 -201
  176. package/README.zh-CN.md +0 -312
  177. package/dist/ProjectOnboarding.js +0 -99
  178. package/dist/ProjectOnboarding.js.map +0 -7
  179. package/dist/Tool.js +0 -1
  180. package/dist/commands/agents.js +0 -2087
  181. package/dist/commands/agents.js.map +0 -7
  182. package/dist/commands/approvedTools.js +0 -36
  183. package/dist/commands/approvedTools.js.map +0 -7
  184. package/dist/commands/bug.js +0 -21
  185. package/dist/commands/bug.js.map +0 -7
  186. package/dist/commands/clear.js +0 -37
  187. package/dist/commands/clear.js.map +0 -7
  188. package/dist/commands/compact.js +0 -104
  189. package/dist/commands/compact.js.map +0 -7
  190. package/dist/commands/config.js +0 -20
  191. package/dist/commands/config.js.map +0 -7
  192. package/dist/commands/cost.js +0 -19
  193. package/dist/commands/cost.js.map +0 -7
  194. package/dist/commands/ctx_viz.js +0 -152
  195. package/dist/commands/ctx_viz.js.map +0 -7
  196. package/dist/commands/doctor.js +0 -25
  197. package/dist/commands/doctor.js.map +0 -7
  198. package/dist/commands/help.js +0 -20
  199. package/dist/commands/help.js.map +0 -7
  200. package/dist/commands/init.js +0 -38
  201. package/dist/commands/init.js.map +0 -7
  202. package/dist/commands/listen.js +0 -37
  203. package/dist/commands/listen.js.map +0 -7
  204. package/dist/commands/login.js +0 -37
  205. package/dist/commands/login.js.map +0 -7
  206. package/dist/commands/logout.js +0 -33
  207. package/dist/commands/logout.js.map +0 -7
  208. package/dist/commands/mcp.js +0 -34
  209. package/dist/commands/mcp.js.map +0 -7
  210. package/dist/commands/model.js +0 -41
  211. package/dist/commands/model.js.map +0 -7
  212. package/dist/commands/modelstatus.js +0 -21
  213. package/dist/commands/modelstatus.js.map +0 -7
  214. package/dist/commands/onboarding.js +0 -36
  215. package/dist/commands/onboarding.js.map +0 -7
  216. package/dist/commands/pr_comments.js +0 -61
  217. package/dist/commands/pr_comments.js.map +0 -7
  218. package/dist/commands/refreshCommands.js +0 -37
  219. package/dist/commands/refreshCommands.js.map +0 -7
  220. package/dist/commands/release-notes.js +0 -30
  221. package/dist/commands/release-notes.js.map +0 -7
  222. package/dist/commands/resume.js +0 -35
  223. package/dist/commands/resume.js.map +0 -7
  224. package/dist/commands/review.js +0 -51
  225. package/dist/commands/review.js.map +0 -7
  226. package/dist/commands/terminalSetup.js +0 -163
  227. package/dist/commands/terminalSetup.js.map +0 -7
  228. package/dist/commands.js +0 -84
  229. package/dist/commands.js.map +0 -7
  230. package/dist/components/ApproveApiKey.js +0 -74
  231. package/dist/components/ApproveApiKey.js.map +0 -7
  232. package/dist/components/AsciiLogo.js +0 -12
  233. package/dist/components/AsciiLogo.js.map +0 -7
  234. package/dist/components/AutoUpdater.js +0 -74
  235. package/dist/components/AutoUpdater.js.map +0 -7
  236. package/dist/components/Bug.js +0 -147
  237. package/dist/components/Bug.js.map +0 -7
  238. package/dist/components/Config.js +0 -166
  239. package/dist/components/Config.js.map +0 -7
  240. package/dist/components/ConsoleOAuthFlow.js +0 -188
  241. package/dist/components/ConsoleOAuthFlow.js.map +0 -7
  242. package/dist/components/Cost.js +0 -13
  243. package/dist/components/Cost.js.map +0 -7
  244. package/dist/components/CostThresholdDialog.js +0 -38
  245. package/dist/components/CostThresholdDialog.js.map +0 -7
  246. package/dist/components/CustomSelect/option-map.js +0 -32
  247. package/dist/components/CustomSelect/option-map.js.map +0 -7
  248. package/dist/components/CustomSelect/select-option.js +0 -34
  249. package/dist/components/CustomSelect/select-option.js.map +0 -7
  250. package/dist/components/CustomSelect/select.js +0 -64
  251. package/dist/components/CustomSelect/select.js.map +0 -7
  252. package/dist/components/CustomSelect/theme.js +0 -1
  253. package/dist/components/CustomSelect/use-select-state.js +0 -220
  254. package/dist/components/CustomSelect/use-select-state.js.map +0 -7
  255. package/dist/components/CustomSelect/use-select.js +0 -21
  256. package/dist/components/CustomSelect/use-select.js.map +0 -7
  257. package/dist/components/FallbackToolUseRejectedMessage.js +0 -11
  258. package/dist/components/FallbackToolUseRejectedMessage.js.map +0 -7
  259. package/dist/components/FileEditToolUpdatedMessage.js +0 -32
  260. package/dist/components/FileEditToolUpdatedMessage.js.map +0 -7
  261. package/dist/components/Help.js +0 -41
  262. package/dist/components/Help.js.map +0 -7
  263. package/dist/components/HighlightedCode.js +0 -30
  264. package/dist/components/HighlightedCode.js.map +0 -7
  265. package/dist/components/InvalidConfigDialog.js +0 -83
  266. package/dist/components/InvalidConfigDialog.js.map +0 -7
  267. package/dist/components/Link.js +0 -18
  268. package/dist/components/Link.js.map +0 -7
  269. package/dist/components/LogSelector.js +0 -50
  270. package/dist/components/LogSelector.js.map +0 -7
  271. package/dist/components/Logo.js +0 -94
  272. package/dist/components/Logo.js.map +0 -7
  273. package/dist/components/MCPServerApprovalDialog.js +0 -79
  274. package/dist/components/MCPServerApprovalDialog.js.map +0 -7
  275. package/dist/components/MCPServerDialogCopy.js +0 -11
  276. package/dist/components/MCPServerDialogCopy.js.map +0 -7
  277. package/dist/components/MCPServerMultiselectDialog.js +0 -80
  278. package/dist/components/MCPServerMultiselectDialog.js.map +0 -7
  279. package/dist/components/Message.js +0 -146
  280. package/dist/components/Message.js.map +0 -7
  281. package/dist/components/MessageResponse.js +0 -9
  282. package/dist/components/MessageResponse.js.map +0 -7
  283. package/dist/components/MessageSelector.js +0 -133
  284. package/dist/components/MessageSelector.js.map +0 -7
  285. package/dist/components/ModeIndicator.js +0 -38
  286. package/dist/components/ModeIndicator.js.map +0 -7
  287. package/dist/components/ModelConfig.js +0 -208
  288. package/dist/components/ModelConfig.js.map +0 -7
  289. package/dist/components/ModelListManager.js +0 -140
  290. package/dist/components/ModelListManager.js.map +0 -7
  291. package/dist/components/ModelSelector.js +0 -1985
  292. package/dist/components/ModelSelector.js.map +0 -7
  293. package/dist/components/ModelStatusDisplay.js +0 -87
  294. package/dist/components/ModelStatusDisplay.js.map +0 -7
  295. package/dist/components/Onboarding.js +0 -153
  296. package/dist/components/Onboarding.js.map +0 -7
  297. package/dist/components/PressEnterToContinue.js +0 -10
  298. package/dist/components/PressEnterToContinue.js.map +0 -7
  299. package/dist/components/PromptInput.js +0 -488
  300. package/dist/components/PromptInput.js.map +0 -7
  301. package/dist/components/SentryErrorBoundary.js +0 -27
  302. package/dist/components/SentryErrorBoundary.js.map +0 -7
  303. package/dist/components/Spinner.js +0 -101
  304. package/dist/components/Spinner.js.map +0 -7
  305. package/dist/components/StickerRequestForm.js +0 -7
  306. package/dist/components/StickerRequestForm.js.map +0 -7
  307. package/dist/components/StructuredDiff.js +0 -148
  308. package/dist/components/StructuredDiff.js.map +0 -7
  309. package/dist/components/TextInput.js +0 -100
  310. package/dist/components/TextInput.js.map +0 -7
  311. package/dist/components/TodoItem.js +0 -35
  312. package/dist/components/TodoItem.js.map +0 -7
  313. package/dist/components/TokenWarning.js +0 -19
  314. package/dist/components/TokenWarning.js.map +0 -7
  315. package/dist/components/ToolUseLoader.js +0 -24
  316. package/dist/components/ToolUseLoader.js.map +0 -7
  317. package/dist/components/TrustDialog.js +0 -76
  318. package/dist/components/TrustDialog.js.map +0 -7
  319. package/dist/components/binary-feedback/BinaryFeedback.js +0 -50
  320. package/dist/components/binary-feedback/BinaryFeedback.js.map +0 -7
  321. package/dist/components/binary-feedback/BinaryFeedbackOption.js +0 -94
  322. package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +0 -7
  323. package/dist/components/binary-feedback/BinaryFeedbackView.js +0 -139
  324. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +0 -7
  325. package/dist/components/binary-feedback/utils.js +0 -161
  326. package/dist/components/binary-feedback/utils.js.map +0 -7
  327. package/dist/components/messages/AssistantBashOutputMessage.js +0 -23
  328. package/dist/components/messages/AssistantBashOutputMessage.js.map +0 -7
  329. package/dist/components/messages/AssistantLocalCommandOutputMessage.js +0 -36
  330. package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +0 -7
  331. package/dist/components/messages/AssistantRedactedThinkingMessage.js +0 -12
  332. package/dist/components/messages/AssistantRedactedThinkingMessage.js.map +0 -7
  333. package/dist/components/messages/AssistantTextMessage.js +0 -78
  334. package/dist/components/messages/AssistantTextMessage.js.map +0 -7
  335. package/dist/components/messages/AssistantThinkingMessage.js +0 -27
  336. package/dist/components/messages/AssistantThinkingMessage.js.map +0 -7
  337. package/dist/components/messages/AssistantToolUseMessage.js +0 -91
  338. package/dist/components/messages/AssistantToolUseMessage.js.map +0 -7
  339. package/dist/components/messages/TaskProgressMessage.js +0 -11
  340. package/dist/components/messages/TaskProgressMessage.js.map +0 -7
  341. package/dist/components/messages/TaskToolMessage.js +0 -39
  342. package/dist/components/messages/TaskToolMessage.js.map +0 -7
  343. package/dist/components/messages/UserBashInputMessage.js +0 -18
  344. package/dist/components/messages/UserBashInputMessage.js.map +0 -7
  345. package/dist/components/messages/UserCommandMessage.js +0 -20
  346. package/dist/components/messages/UserCommandMessage.js.map +0 -7
  347. package/dist/components/messages/UserKodingInputMessage.js +0 -18
  348. package/dist/components/messages/UserKodingInputMessage.js.map +0 -7
  349. package/dist/components/messages/UserPromptMessage.js +0 -20
  350. package/dist/components/messages/UserPromptMessage.js.map +0 -7
  351. package/dist/components/messages/UserTextMessage.js +0 -25
  352. package/dist/components/messages/UserTextMessage.js.map +0 -7
  353. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +0 -10
  354. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +0 -7
  355. package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js +0 -15
  356. package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js.map +0 -7
  357. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +0 -25
  358. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +0 -7
  359. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +0 -47
  360. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +0 -7
  361. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +0 -23
  362. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +0 -7
  363. package/dist/components/messages/UserToolResultMessage/utils.js +0 -42
  364. package/dist/components/messages/UserToolResultMessage/utils.js.map +0 -7
  365. package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js +0 -112
  366. package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js.map +0 -7
  367. package/dist/components/permissions/FallbackPermissionRequest.js +0 -131
  368. package/dist/components/permissions/FallbackPermissionRequest.js.map +0 -7
  369. package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +0 -159
  370. package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js.map +0 -7
  371. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +0 -58
  372. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +0 -7
  373. package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +0 -153
  374. package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js.map +0 -7
  375. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +0 -70
  376. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +0 -7
  377. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +0 -212
  378. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +0 -7
  379. package/dist/components/permissions/PermissionRequest.js +0 -70
  380. package/dist/components/permissions/PermissionRequest.js.map +0 -7
  381. package/dist/components/permissions/PermissionRequestTitle.js +0 -52
  382. package/dist/components/permissions/PermissionRequestTitle.js.map +0 -7
  383. package/dist/components/permissions/hooks.js +0 -28
  384. package/dist/components/permissions/hooks.js.map +0 -7
  385. package/dist/components/permissions/toolUseOptions.js +0 -46
  386. package/dist/components/permissions/toolUseOptions.js.map +0 -7
  387. package/dist/components/permissions/utils.js +0 -21
  388. package/dist/components/permissions/utils.js.map +0 -7
  389. package/dist/constants/betas.js +0 -11
  390. package/dist/constants/betas.js.map +0 -7
  391. package/dist/constants/claude-asterisk-ascii-art.js +0 -242
  392. package/dist/constants/claude-asterisk-ascii-art.js.map +0 -7
  393. package/dist/constants/figures.js +0 -6
  394. package/dist/constants/figures.js.map +0 -7
  395. package/dist/constants/keys.js +0 -7
  396. package/dist/constants/keys.js.map +0 -7
  397. package/dist/constants/macros.js +0 -13
  398. package/dist/constants/macros.js.map +0 -7
  399. package/dist/constants/modelCapabilities.js +0 -154
  400. package/dist/constants/modelCapabilities.js.map +0 -7
  401. package/dist/constants/models.js +0 -1034
  402. package/dist/constants/models.js.map +0 -7
  403. package/dist/constants/oauth.js +0 -18
  404. package/dist/constants/oauth.js.map +0 -7
  405. package/dist/constants/product.js +0 -26
  406. package/dist/constants/product.js.map +0 -7
  407. package/dist/constants/prompts.js +0 -168
  408. package/dist/constants/prompts.js.map +0 -7
  409. package/dist/constants/releaseNotes.js +0 -9
  410. package/dist/constants/releaseNotes.js.map +0 -7
  411. package/dist/context/PermissionContext.js +0 -111
  412. package/dist/context/PermissionContext.js.map +0 -7
  413. package/dist/context.js +0 -259
  414. package/dist/context.js.map +0 -7
  415. package/dist/cost-tracker.js.map +0 -7
  416. package/dist/entrypoints/cli.js +0 -1107
  417. package/dist/entrypoints/cli.js.map +0 -7
  418. package/dist/entrypoints/mcp.js +0 -150
  419. package/dist/entrypoints/mcp.js.map +0 -7
  420. package/dist/history.js +0 -25
  421. package/dist/history.js.map +0 -7
  422. package/dist/hooks/useApiKeyVerification.js +0 -12
  423. package/dist/hooks/useApiKeyVerification.js.map +0 -7
  424. package/dist/hooks/useArrowKeyHistory.js +0 -50
  425. package/dist/hooks/useArrowKeyHistory.js.map +0 -7
  426. package/dist/hooks/useCanUseTool.js +0 -112
  427. package/dist/hooks/useCanUseTool.js.map +0 -7
  428. package/dist/hooks/useCancelRequest.js +0 -30
  429. package/dist/hooks/useCancelRequest.js.map +0 -7
  430. package/dist/hooks/useDoublePress.js +0 -31
  431. package/dist/hooks/useDoublePress.js.map +0 -7
  432. package/dist/hooks/useExitOnCtrlCD.js +0 -26
  433. package/dist/hooks/useExitOnCtrlCD.js.map +0 -7
  434. package/dist/hooks/useInterval.js +0 -18
  435. package/dist/hooks/useInterval.js.map +0 -7
  436. package/dist/hooks/useLogMessages.js +0 -14
  437. package/dist/hooks/useLogMessages.js.map +0 -7
  438. package/dist/hooks/useLogStartupTime.js +0 -15
  439. package/dist/hooks/useLogStartupTime.js.map +0 -7
  440. package/dist/hooks/useNotifyAfterTimeout.js +0 -42
  441. package/dist/hooks/useNotifyAfterTimeout.js.map +0 -7
  442. package/dist/hooks/usePermissionRequestLogging.js +0 -28
  443. package/dist/hooks/usePermissionRequestLogging.js.map +0 -7
  444. package/dist/hooks/useTerminalSize.js +0 -38
  445. package/dist/hooks/useTerminalSize.js.map +0 -7
  446. package/dist/hooks/useTextInput.js +0 -250
  447. package/dist/hooks/useTextInput.js.map +0 -7
  448. package/dist/hooks/useUnifiedCompletion.js +0 -929
  449. package/dist/hooks/useUnifiedCompletion.js.map +0 -7
  450. package/dist/messages.js +0 -33
  451. package/dist/messages.js.map +0 -7
  452. package/dist/permissions.js +0 -194
  453. package/dist/permissions.js.map +0 -7
  454. package/dist/query.js +0 -492
  455. package/dist/query.js.map +0 -7
  456. package/dist/screens/ConfigureNpmPrefix.js +0 -128
  457. package/dist/screens/ConfigureNpmPrefix.js.map +0 -7
  458. package/dist/screens/Doctor.js +0 -22
  459. package/dist/screens/Doctor.js.map +0 -7
  460. package/dist/screens/LogList.js +0 -55
  461. package/dist/screens/LogList.js.map +0 -7
  462. package/dist/screens/REPL.js +0 -593
  463. package/dist/screens/REPL.js.map +0 -7
  464. package/dist/screens/ResumeConversation.js +0 -56
  465. package/dist/screens/ResumeConversation.js.map +0 -7
  466. package/dist/services/adapters/base.js +0 -29
  467. package/dist/services/adapters/base.js.map +0 -7
  468. package/dist/services/adapters/chatCompletions.js +0 -69
  469. package/dist/services/adapters/chatCompletions.js.map +0 -7
  470. package/dist/services/adapters/responsesAPI.js +0 -126
  471. package/dist/services/adapters/responsesAPI.js.map +0 -7
  472. package/dist/services/browserMocks.js +0 -48
  473. package/dist/services/browserMocks.js.map +0 -7
  474. package/dist/services/claude.js +0 -1605
  475. package/dist/services/claude.js.map +0 -7
  476. package/dist/services/customCommands.js +0 -359
  477. package/dist/services/customCommands.js.map +0 -7
  478. package/dist/services/fileFreshness.js +0 -280
  479. package/dist/services/fileFreshness.js.map +0 -7
  480. package/dist/services/gpt5ConnectionTest.js +0 -248
  481. package/dist/services/gpt5ConnectionTest.js.map +0 -7
  482. package/dist/services/mcpClient.js +0 -435
  483. package/dist/services/mcpClient.js.map +0 -7
  484. package/dist/services/mcpServerApproval.js +0 -55
  485. package/dist/services/mcpServerApproval.js.map +0 -7
  486. package/dist/services/mentionProcessor.js.map +0 -7
  487. package/dist/services/modelAdapterFactory.js +0 -47
  488. package/dist/services/modelAdapterFactory.js.map +0 -7
  489. package/dist/services/notifier.js +0 -35
  490. package/dist/services/notifier.js.map +0 -7
  491. package/dist/services/oauth.js +0 -259
  492. package/dist/services/oauth.js.map +0 -7
  493. package/dist/services/openai.js.map +0 -7
  494. package/dist/services/responseStateManager.js +0 -68
  495. package/dist/services/responseStateManager.js.map +0 -7
  496. package/dist/services/sentry.js +0 -9
  497. package/dist/services/sentry.js.map +0 -7
  498. package/dist/services/statsig.js +0 -112
  499. package/dist/services/statsig.js.map +0 -7
  500. package/dist/services/statsigStorage.js +0 -75
  501. package/dist/services/statsigStorage.js.map +0 -7
  502. package/dist/services/systemReminder.js.map +0 -7
  503. package/dist/services/vcr.js +0 -133
  504. package/dist/services/vcr.js.map +0 -7
  505. package/dist/tools/ArchitectTool/ArchitectTool.js +0 -119
  506. package/dist/tools/ArchitectTool/ArchitectTool.js.map +0 -7
  507. package/dist/tools/ArchitectTool/prompt.js +0 -18
  508. package/dist/tools/ArchitectTool/prompt.js.map +0 -7
  509. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -423
  510. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +0 -7
  511. package/dist/tools/BashTool/BashTool.js +0 -188
  512. package/dist/tools/BashTool/BashTool.js.map +0 -7
  513. package/dist/tools/BashTool/BashToolResultMessage.js +0 -21
  514. package/dist/tools/BashTool/BashToolResultMessage.js.map +0 -7
  515. package/dist/tools/BashTool/OutputLine.js +0 -30
  516. package/dist/tools/BashTool/OutputLine.js.map +0 -7
  517. package/dist/tools/BashTool/prompt.js +0 -179
  518. package/dist/tools/BashTool/prompt.js.map +0 -7
  519. package/dist/tools/BashTool/utils.js +0 -51
  520. package/dist/tools/BashTool/utils.js.map +0 -7
  521. package/dist/tools/FileEditTool/FileEditTool.js +0 -228
  522. package/dist/tools/FileEditTool/FileEditTool.js.map +0 -7
  523. package/dist/tools/FileEditTool/prompt.js +0 -54
  524. package/dist/tools/FileEditTool/prompt.js.map +0 -7
  525. package/dist/tools/FileEditTool/utils.js +0 -42
  526. package/dist/tools/FileEditTool/utils.js.map +0 -7
  527. package/dist/tools/FileReadTool/FileReadTool.js +0 -272
  528. package/dist/tools/FileReadTool/FileReadTool.js.map +0 -7
  529. package/dist/tools/FileReadTool/prompt.js +0 -10
  530. package/dist/tools/FileReadTool/prompt.js.map +0 -7
  531. package/dist/tools/FileWriteTool/FileWriteTool.js +0 -204
  532. package/dist/tools/FileWriteTool/FileWriteTool.js.map +0 -7
  533. package/dist/tools/FileWriteTool/prompt.js +0 -14
  534. package/dist/tools/FileWriteTool/prompt.js.map +0 -7
  535. package/dist/tools/GlobTool/GlobTool.js +0 -88
  536. package/dist/tools/GlobTool/GlobTool.js.map +0 -7
  537. package/dist/tools/GlobTool/prompt.js +0 -12
  538. package/dist/tools/GlobTool/prompt.js.map +0 -7
  539. package/dist/tools/GrepTool/GrepTool.js +0 -107
  540. package/dist/tools/GrepTool/GrepTool.js.map +0 -7
  541. package/dist/tools/GrepTool/prompt.js +0 -15
  542. package/dist/tools/GrepTool/prompt.js.map +0 -7
  543. package/dist/tools/MCPTool/MCPTool.js +0 -90
  544. package/dist/tools/MCPTool/MCPTool.js.map +0 -7
  545. package/dist/tools/MCPTool/prompt.js +0 -7
  546. package/dist/tools/MCPTool/prompt.js.map +0 -7
  547. package/dist/tools/MemoryReadTool/MemoryReadTool.js +0 -103
  548. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +0 -7
  549. package/dist/tools/MemoryReadTool/prompt.js +0 -7
  550. package/dist/tools/MemoryReadTool/prompt.js.map +0 -7
  551. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +0 -77
  552. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +0 -7
  553. package/dist/tools/MemoryWriteTool/prompt.js +0 -7
  554. package/dist/tools/MemoryWriteTool/prompt.js.map +0 -7
  555. package/dist/tools/MultiEditTool/MultiEditTool.js +0 -308
  556. package/dist/tools/MultiEditTool/MultiEditTool.js.map +0 -7
  557. package/dist/tools/MultiEditTool/prompt.js +0 -48
  558. package/dist/tools/MultiEditTool/prompt.js.map +0 -7
  559. package/dist/tools/NotebookEditTool/NotebookEditTool.js +0 -238
  560. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +0 -7
  561. package/dist/tools/NotebookEditTool/prompt.js +0 -7
  562. package/dist/tools/NotebookEditTool/prompt.js.map +0 -7
  563. package/dist/tools/NotebookReadTool/NotebookReadTool.js +0 -212
  564. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +0 -7
  565. package/dist/tools/NotebookReadTool/prompt.js +0 -7
  566. package/dist/tools/NotebookReadTool/prompt.js.map +0 -7
  567. package/dist/tools/StickerRequestTool/StickerRequestTool.js +0 -86
  568. package/dist/tools/StickerRequestTool/StickerRequestTool.js.map +0 -7
  569. package/dist/tools/StickerRequestTool/prompt.js +0 -23
  570. package/dist/tools/StickerRequestTool/prompt.js.map +0 -7
  571. package/dist/tools/TaskTool/TaskTool.js +0 -351
  572. package/dist/tools/TaskTool/TaskTool.js.map +0 -7
  573. package/dist/tools/TaskTool/constants.js +0 -5
  574. package/dist/tools/TaskTool/constants.js.map +0 -7
  575. package/dist/tools/TaskTool/prompt.js +0 -82
  576. package/dist/tools/TaskTool/prompt.js.map +0 -7
  577. package/dist/tools/ThinkTool/ThinkTool.js +0 -48
  578. package/dist/tools/ThinkTool/ThinkTool.js.map +0 -7
  579. package/dist/tools/ThinkTool/prompt.js +0 -16
  580. package/dist/tools/ThinkTool/prompt.js.map +0 -7
  581. package/dist/tools/TodoWriteTool/TodoWriteTool.js +0 -216
  582. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +0 -7
  583. package/dist/tools/TodoWriteTool/prompt.js +0 -66
  584. package/dist/tools/TodoWriteTool/prompt.js.map +0 -7
  585. package/dist/tools/URLFetcherTool/URLFetcherTool.js +0 -137
  586. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +0 -7
  587. package/dist/tools/URLFetcherTool/cache.js +0 -45
  588. package/dist/tools/URLFetcherTool/cache.js.map +0 -7
  589. package/dist/tools/URLFetcherTool/htmlToMarkdown.js +0 -42
  590. package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +0 -7
  591. package/dist/tools/URLFetcherTool/prompt.js +0 -22
  592. package/dist/tools/URLFetcherTool/prompt.js.map +0 -7
  593. package/dist/tools/WebSearchTool/WebSearchTool.js +0 -86
  594. package/dist/tools/WebSearchTool/WebSearchTool.js.map +0 -7
  595. package/dist/tools/WebSearchTool/prompt.js +0 -17
  596. package/dist/tools/WebSearchTool/prompt.js.map +0 -7
  597. package/dist/tools/WebSearchTool/searchProviders.js +0 -48
  598. package/dist/tools/WebSearchTool/searchProviders.js.map +0 -7
  599. package/dist/tools/lsTool/lsTool.js +0 -201
  600. package/dist/tools/lsTool/lsTool.js.map +0 -7
  601. package/dist/tools/lsTool/prompt.js +0 -5
  602. package/dist/tools/lsTool/prompt.js.map +0 -7
  603. package/dist/tools.js +0 -64
  604. package/dist/tools.js.map +0 -7
  605. package/dist/types/PermissionMode.js +0 -82
  606. package/dist/types/PermissionMode.js.map +0 -7
  607. package/dist/types/RequestContext.js +0 -47
  608. package/dist/types/RequestContext.js.map +0 -7
  609. package/dist/types/common.d.js +0 -1
  610. package/dist/types/conversation.js +0 -1
  611. package/dist/types/logs.js +0 -1
  612. package/dist/types/modelCapabilities.js +0 -1
  613. package/dist/types/notebook.js +0 -1
  614. package/dist/utils/Cursor.js +0 -313
  615. package/dist/utils/Cursor.js.map +0 -7
  616. package/dist/utils/PersistentShell.js +0 -382
  617. package/dist/utils/PersistentShell.js.map +0 -7
  618. package/dist/utils/advancedFuzzyMatcher.js +0 -206
  619. package/dist/utils/advancedFuzzyMatcher.js.map +0 -7
  620. package/dist/utils/agentLoader.js +0 -199
  621. package/dist/utils/agentLoader.js.map +0 -7
  622. package/dist/utils/agentStorage.js +0 -59
  623. package/dist/utils/agentStorage.js.map +0 -7
  624. package/dist/utils/array.js +0 -7
  625. package/dist/utils/array.js.map +0 -7
  626. package/dist/utils/ask.js +0 -77
  627. package/dist/utils/ask.js.map +0 -7
  628. package/dist/utils/auth.js +0 -11
  629. package/dist/utils/auth.js.map +0 -7
  630. package/dist/utils/autoCompactCore.js +0 -149
  631. package/dist/utils/autoCompactCore.js.map +0 -7
  632. package/dist/utils/autoUpdater.js.map +0 -7
  633. package/dist/utils/betas.js +0 -21
  634. package/dist/utils/betas.js.map +0 -7
  635. package/dist/utils/browser.js +0 -15
  636. package/dist/utils/browser.js.map +0 -7
  637. package/dist/utils/cleanup.js +0 -54
  638. package/dist/utils/cleanup.js.map +0 -7
  639. package/dist/utils/commands.js +0 -207
  640. package/dist/utils/commands.js.map +0 -7
  641. package/dist/utils/commonUnixCommands.js +0 -687
  642. package/dist/utils/commonUnixCommands.js.map +0 -7
  643. package/dist/utils/config.js.map +0 -7
  644. package/dist/utils/conversationRecovery.js +0 -35
  645. package/dist/utils/conversationRecovery.js.map +0 -7
  646. package/dist/utils/debugLogger.js.map +0 -7
  647. package/dist/utils/diff.js +0 -32
  648. package/dist/utils/diff.js.map +0 -7
  649. package/dist/utils/env.js +0 -44
  650. package/dist/utils/env.js.map +0 -7
  651. package/dist/utils/errors.js +0 -23
  652. package/dist/utils/errors.js.map +0 -7
  653. package/dist/utils/exampleCommands.js +0 -80
  654. package/dist/utils/exampleCommands.js.map +0 -7
  655. package/dist/utils/execFileNoThrow.js +0 -44
  656. package/dist/utils/execFileNoThrow.js.map +0 -7
  657. package/dist/utils/expertChatStorage.js +0 -78
  658. package/dist/utils/expertChatStorage.js.map +0 -7
  659. package/dist/utils/file.js +0 -282
  660. package/dist/utils/file.js.map +0 -7
  661. package/dist/utils/fileRecoveryCore.js +0 -41
  662. package/dist/utils/fileRecoveryCore.js.map +0 -7
  663. package/dist/utils/format.js +0 -41
  664. package/dist/utils/format.js.map +0 -7
  665. package/dist/utils/fuzzyMatcher.js +0 -252
  666. package/dist/utils/fuzzyMatcher.js.map +0 -7
  667. package/dist/utils/generators.js +0 -46
  668. package/dist/utils/generators.js.map +0 -7
  669. package/dist/utils/git.js +0 -83
  670. package/dist/utils/git.js.map +0 -7
  671. package/dist/utils/globalLogger.js +0 -54
  672. package/dist/utils/globalLogger.js.map +0 -7
  673. package/dist/utils/http.js +0 -7
  674. package/dist/utils/http.js.map +0 -7
  675. package/dist/utils/imagePaste.js +0 -29
  676. package/dist/utils/imagePaste.js.map +0 -7
  677. package/dist/utils/json.js +0 -16
  678. package/dist/utils/json.js.map +0 -7
  679. package/dist/utils/log.js +0 -298
  680. package/dist/utils/log.js.map +0 -7
  681. package/dist/utils/markdown.js +0 -187
  682. package/dist/utils/markdown.js.map +0 -7
  683. package/dist/utils/messageContextManager.js +0 -195
  684. package/dist/utils/messageContextManager.js.map +0 -7
  685. package/dist/utils/messages.js +0 -633
  686. package/dist/utils/messages.js.map +0 -7
  687. package/dist/utils/model.js.map +0 -7
  688. package/dist/utils/permissions/filesystem.js +0 -80
  689. package/dist/utils/permissions/filesystem.js.map +0 -7
  690. package/dist/utils/responseState.js +0 -20
  691. package/dist/utils/responseState.js.map +0 -7
  692. package/dist/utils/ripgrep.js +0 -131
  693. package/dist/utils/ripgrep.js.map +0 -7
  694. package/dist/utils/secureFile.js +0 -483
  695. package/dist/utils/secureFile.js.map +0 -7
  696. package/dist/utils/sessionState.js +0 -31
  697. package/dist/utils/sessionState.js.map +0 -7
  698. package/dist/utils/state.js +0 -24
  699. package/dist/utils/state.js.map +0 -7
  700. package/dist/utils/style.js +0 -31
  701. package/dist/utils/style.js.map +0 -7
  702. package/dist/utils/terminal.js +0 -43
  703. package/dist/utils/terminal.js.map +0 -7
  704. package/dist/utils/theme.js.map +0 -7
  705. package/dist/utils/thinking.js +0 -103
  706. package/dist/utils/thinking.js.map +0 -7
  707. package/dist/utils/todoStorage.js +0 -291
  708. package/dist/utils/todoStorage.js.map +0 -7
  709. package/dist/utils/tokens.js +0 -30
  710. package/dist/utils/tokens.js.map +0 -7
  711. package/dist/utils/toolExecutionController.js +0 -109
  712. package/dist/utils/toolExecutionController.js.map +0 -7
  713. package/dist/utils/unaryLogging.js +0 -14
  714. package/dist/utils/unaryLogging.js.map +0 -7
  715. package/dist/utils/user.js +0 -40
  716. package/dist/utils/user.js.map +0 -7
  717. package/dist/utils/validate.js +0 -132
  718. package/dist/utils/validate.js.map +0 -7
  719. /package/dist/{Tool.js.map → REPL-GIU4ZIXM.js.map} +0 -0
  720. /package/dist/{components/CustomSelect/theme.js.map → autoUpdater-DNRMJWFQ.js.map} +0 -0
  721. /package/dist/{types/common.d.js.map → chunk-JC6NCUG5.js.map} +0 -0
  722. /package/dist/{types/conversation.js.map → commands-TWH6PGVG.js.map} +0 -0
  723. /package/dist/{types/logs.js.map → config-6ZMBCL23.js.map} +0 -0
  724. /package/dist/{types/modelCapabilities.js.map → context-JQIOOI4W.js.map} +0 -0
  725. /package/dist/{types/notebook.js.map → costTracker-6SL26FDB.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/components/ModelSelector.tsx"],
4
- "sourcesContent": ["import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '../utils/theme'\nimport { Select } from './CustomSelect/select'\nimport { Newline } from 'ink'\nimport { getModelManager } from '../utils/model'\n\n// \u5171\u4EAB\u7684\u5C4F\u5E55\u5BB9\u5668\u7EC4\u4EF6\uFF0C\u907F\u514D\u91CD\u590D\u8FB9\u6846\nfunction ScreenContainer({\n title,\n exitState,\n children,\n}: {\n title: string\n exitState: { pending: boolean; keyName: string }\n children: React.ReactNode\n}) {\n const theme = getTheme()\n return (\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n {title}{' '}\n {exitState.pending ? `(press ${exitState.keyName} again to exit)` : ''}\n </Text>\n {children}\n </Box>\n )\n}\nimport { PRODUCT_NAME } from '../constants/product'\nimport { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n ProviderType,\n ModelPointerType,\n setAllPointersToModel,\n setModelPointer,\n} from '../utils/config.js'\nimport models, { providers } from '../constants/models'\nimport TextInput from './TextInput'\nimport OpenAI from 'openai'\nimport chalk from 'chalk'\nimport { fetchAnthropicModels, verifyApiKey } from '../services/claude'\nimport { fetchCustomModels, getModelFeatures } from '../services/openai'\nimport { testGPT5Connection, validateGPT5Config } from '../services/gpt5ConnectionTest'\ntype Props = {\n onDone: () => void\n abortController?: AbortController\n targetPointer?: ModelPointerType // NEW: Target pointer for configuration\n isOnboarding?: boolean // NEW: Whether this is first-time setup\n onCancel?: () => void // NEW: Cancel callback (different from onDone)\n skipModelType?: boolean // NEW: Skip model type selection\n}\n\ntype ModelInfo = {\n model: string\n provider: string\n [key: string]: any\n}\n\n// Define reasoning effort options\ntype ReasoningEffortOption = 'low' | 'medium' | 'high'\n\n// Define context length options (in tokens)\ntype ContextLengthOption = {\n label: string\n value: number\n}\n\nconst 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\nconst DEFAULT_CONTEXT_LENGTH = 128000\n\n// Define max tokens options\ntype MaxTokensOption = {\n label: string\n value: number\n}\n\nconst 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\nconst DEFAULT_MAX_TOKENS = 8192\n\n// Custom hook to handle Escape key navigation\nfunction useEscapeNavigation(\n onEscape: () => void,\n abortController?: AbortController,\n) {\n // Use a ref to track if we've handled the escape key\n const handledRef = useRef(false)\n\n useInput(\n (input, key) => {\n if (key.escape && !handledRef.current) {\n handledRef.current = true\n // Reset after a short delay to allow for multiple escapes\n setTimeout(() => {\n handledRef.current = false\n }, 100)\n onEscape()\n }\n },\n { isActive: true },\n )\n}\n\nfunction printModelConfig() {\n const config = getGlobalConfig()\n // Only show ModelProfile information - no legacy fields\n const modelProfiles = config.modelProfiles || []\n const activeProfiles = modelProfiles.filter(p => p.isActive)\n\n if (activeProfiles.length === 0) {\n console.log(chalk.gray(' \u23BF No active model profiles configured'))\n return\n }\n\n const profileSummary = activeProfiles\n .map(p => `${p.name} (${p.provider}: ${p.modelName})`)\n .join(' | ')\n console.log(chalk.gray(` \u23BF ${profileSummary}`))\n}\n\nexport function ModelSelector({\n onDone: onDoneProp,\n abortController,\n targetPointer,\n isOnboarding = false,\n onCancel,\n skipModelType = false,\n}: Props): React.ReactNode {\n const config = getGlobalConfig()\n const theme = getTheme()\n const onDone = () => {\n printModelConfig()\n onDoneProp()\n }\n // Initialize the exit hook but don't use it for Escape key\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n // Always start with provider selection in new system\n const getInitialScreen = (): string => {\n return 'provider'\n }\n\n // Screen navigation stack\n const [screenStack, setScreenStack] = useState<\n Array<\n | 'provider'\n | 'anthropicSubMenu'\n | 'apiKey'\n | 'resourceName'\n | 'baseUrl'\n | 'model'\n | 'modelInput'\n | 'modelParams'\n | 'contextLength'\n | 'connectionTest'\n | 'confirmation'\n >\n >([getInitialScreen()])\n\n // Current screen is always the last item in the stack\n const currentScreen = screenStack[screenStack.length - 1]\n\n // Function to navigate to a new screen\n const navigateTo = (\n screen:\n | 'provider'\n | 'anthropicSubMenu'\n | 'apiKey'\n | 'resourceName'\n | 'baseUrl'\n | 'model'\n | 'modelInput'\n | 'modelParams'\n | 'contextLength'\n | 'connectionTest'\n | 'confirmation',\n ) => {\n setScreenStack(prev => [...prev, screen])\n }\n\n // Function to go back to the previous screen\n const goBack = () => {\n if (screenStack.length > 1) {\n // Remove the current screen from the stack\n setScreenStack(prev => prev.slice(0, -1))\n } else {\n // If we're at the first screen, call onDone to exit\n onDone()\n }\n }\n\n // State for model configuration\n const [selectedProvider, setSelectedProvider] = useState<ProviderType>(\n config.primaryProvider ?? 'anthropic',\n )\n\n // State for Anthropic provider sub-menu\n const [anthropicProviderType, setAnthropicProviderType] = useState<\n 'official' | 'bigdream' | 'opendev' | 'custom'\n >('official')\n const [selectedModel, setSelectedModel] = useState<string>('')\n const [apiKey, setApiKey] = useState<string>('')\n\n // New state for model parameters\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>('medium')\n const [supportsReasoningEffort, setSupportsReasoningEffort] =\n useState<boolean>(false)\n\n // Context length state (use default instead of legacy config)\n const [contextLength, setContextLength] = useState<number>(\n DEFAULT_CONTEXT_LENGTH,\n )\n\n // Form focus state\n const [activeFieldIndex, setActiveFieldIndex] = useState(0)\n const [maxTokensCursorOffset, setMaxTokensCursorOffset] = useState<number>(0)\n\n // UI state\n\n // Search and model loading state\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 // Retry logic state\n const [fetchRetryCount, setFetchRetryCount] = useState<number>(0)\n const [isRetrying, setIsRetrying] = useState<boolean>(false)\n\n // Connection test state\n const [isTestingConnection, setIsTestingConnection] = useState<boolean>(false)\n const [connectionTestResult, setConnectionTestResult] = useState<{\n success: boolean\n message: string\n endpoint?: string\n details?: string\n } | null>(null)\n\n // Validation error state for duplicate model detection\n const [validationError, setValidationError] = useState<string | null>(null)\n\n // State for Azure-specific configuration\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 // State for Ollama-specific configuration\n const [ollamaBaseUrl, setOllamaBaseUrl] = useState<string>(\n 'http://localhost:11434/v1',\n )\n const [ollamaBaseUrlCursorOffset, setOllamaBaseUrlCursorOffset] =\n useState<number>(0)\n\n // State for custom OpenAI-compatible API configuration\n const [customBaseUrl, setCustomBaseUrl] = useState<string>('')\n const [customBaseUrlCursorOffset, setCustomBaseUrlCursorOffset] =\n useState<number>(0)\n\n // State for provider base URL configuration (used for all providers)\n const [providerBaseUrl, setProviderBaseUrl] = useState<string>('')\n const [providerBaseUrlCursorOffset, setProviderBaseUrlCursorOffset] =\n useState<number>(0)\n\n // Reasoning effort options\n const reasoningEffortOptions = [\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\n // Get available providers from models.ts, excluding community Claude providers (now in Anthropic sub-menu)\n const availableProviders = Object.keys(providers).filter(\n provider => provider !== 'bigdream' && provider !== 'opendev',\n )\n\n // Create provider options with nice labels\n const providerOptions = availableProviders.map(provider => {\n const modelCount = models[provider]?.length || 0\n const label = getProviderLabel(provider, modelCount)\n return {\n label,\n value: provider,\n }\n })\n\n useEffect(() => {\n if (!apiKeyEdited && selectedProvider) {\n if (process.env[selectedProvider.toUpperCase() + '_API_KEY']) {\n setApiKey(\n process.env[selectedProvider.toUpperCase() + '_API_KEY'] as string,\n )\n } else {\n setApiKey('')\n }\n }\n }, [selectedProvider, apiKey, apiKeyEdited])\n\n // Ensure contextLength is always set to a valid option when contextLength screen is displayed\n useEffect(() => {\n if (\n currentScreen === 'contextLength' &&\n !CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength)\n ) {\n setContextLength(DEFAULT_CONTEXT_LENGTH)\n }\n }, [currentScreen, contextLength])\n\n // Create a set of model names from our constants/models.ts for the current provider\n const ourModelNames = new Set(\n (models[selectedProvider as keyof typeof models] || []).map(\n (model: any) => model.model,\n ),\n )\n\n // Create model options from available models, filtered by search query\n const filteredModels = modelSearchQuery\n ? availableModels.filter(model =>\n model.model?.toLowerCase().includes(modelSearchQuery.toLowerCase()),\n )\n : availableModels\n\n // Sort models with priority for specific keywords\n const 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 // Add safety checks for undefined model names\n const aModelLower = a.model?.toLowerCase() || ''\n const bModelLower = b.model?.toLowerCase() || ''\n\n // Check if models contain priority keywords\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 one has priority and the other doesn't, prioritize the one with keywords\n if (aHasPriority && !bHasPriority) return -1\n if (!aHasPriority && bHasPriority) return 1\n\n // If both have priority or neither has priority, sort alphabetically\n return a.model.localeCompare(b.model)\n })\n }\n\n const sortedFilteredModels = sortModelsByPriority(filteredModels)\n\n const modelOptions = sortedFilteredModels.map(model => {\n // Check if this model is in our constants/models.ts list\n const isInOurModels = ourModelNames.has(model.model)\n\n return {\n label: `${model.model}${getModelDetails(model)}`,\n value: model.model,\n }\n })\n\n function getModelDetails(model: ModelInfo): string {\n const details = []\n\n if (model.max_tokens) {\n details.push(`${formatNumber(model.max_tokens)} tokens`)\n }\n\n if (model.supports_vision) {\n details.push('vision')\n }\n\n if (model.supports_function_calling) {\n details.push('tools')\n }\n\n return details.length > 0 ? ` (${details.join(', ')})` : ''\n }\n\n function formatNumber(num: number): string {\n if (num >= 1000000) {\n return `${(num / 1000000).toFixed(1)}M`\n } else if (num >= 1000) {\n return `${(num / 1000).toFixed(0)}K`\n }\n return num.toString()\n }\n\n function getProviderLabel(provider: string, modelCount: number): string {\n // Use provider names from the providers object if available\n if (providers[provider]) {\n return `${providers[provider].name} ${providers[provider].status === 'wip' ? '(WIP)' : ''} (${modelCount} models)`\n }\n return `${provider}`\n }\n\n function handleProviderSelection(provider: string) {\n const providerType = provider as ProviderType\n setSelectedProvider(providerType)\n\n if (provider === 'custom') {\n // For custom provider, save and exit\n saveConfiguration(providerType, selectedModel || '')\n onDone()\n } else if (provider === 'anthropic') {\n // For Anthropic provider, go to sub-menu to choose between official, community proxies, or custom\n navigateTo('anthropicSubMenu')\n } else {\n // For all other providers, go to base URL configuration first\n // Initialize with the default base URL for the provider\n const defaultBaseUrl = providers[providerType]?.baseURL || ''\n setProviderBaseUrl(defaultBaseUrl)\n navigateTo('baseUrl')\n }\n }\n\n // Local implementation of fetchAnthropicModels for UI\n async 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 // Handle different response formats\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\n async function fetchAnthropicCompatibleModelsWithFallback(\n baseURL: string,\n provider: string,\n apiKeyUrl: string,\n ) {\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: 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 console.log(\n `Anthropic API failed for ${provider}, trying OpenAI format:`,\n 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: 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 console.log(\n `OpenAI API failed for ${provider}, falling back to manual input:`,\n error,\n )\n }\n\n // \u7B2C\u4E09\u5C42\uFF1A\u629B\u51FA\u9519\u8BEF\uFF0C\u89E6\u53D1\u624B\u52A8\u8F93\u5165\u6A21\u5F0F\n let errorMessage = `Failed to fetch ${provider} models using both Anthropic and OpenAI API formats`\n\n if (lastError) {\n errorMessage = lastError.message\n }\n\n // \u6DFB\u52A0\u6709\u7528\u7684\u5EFA\u8BAE\n if (errorMessage.includes('API key')) {\n errorMessage += `\\n\\n\uD83D\uDCA1 Tip: Get your API key from ${apiKeyUrl}`\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\n // \u7EDF\u4E00\u5904\u7406\u6240\u6709Anthropic\u517C\u5BB9\u63D0\u4F9B\u5546\u7684\u6A21\u578B\u83B7\u53D6\n async function fetchAnthropicCompatibleProviderModels() {\n // \u6839\u636EanthropicProviderType\u786E\u5B9A\u9ED8\u8BA4baseURL\u548CAPI key\u83B7\u53D6\u5730\u5740\n let defaultBaseURL: string\n let apiKeyUrl: string\n let actualProvider: string\n\n switch (anthropicProviderType) {\n case 'official':\n defaultBaseURL = 'https://api.anthropic.com'\n apiKeyUrl = 'https://console.anthropic.com/settings/keys'\n actualProvider = 'anthropic'\n break\n case 'bigdream':\n defaultBaseURL = 'https://api-key.info'\n apiKeyUrl = 'https://api-key.info/register?aff=MSl4'\n actualProvider = 'bigdream'\n break\n case 'opendev':\n defaultBaseURL = 'https://api.openai-next.com'\n apiKeyUrl = 'https://api.openai-next.com/register/?aff_code=4xo7'\n actualProvider = 'opendev'\n break\n case 'custom':\n defaultBaseURL = providerBaseUrl\n apiKeyUrl = 'your custom API provider'\n actualProvider = 'anthropic'\n break\n default:\n throw new Error(\n `Unsupported Anthropic provider type: ${anthropicProviderType}`,\n )\n }\n\n const baseURL =\n anthropicProviderType === 'custom'\n ? providerBaseUrl\n : providerBaseUrl || defaultBaseURL\n return await fetchAnthropicCompatibleModelsWithFallback(\n baseURL,\n actualProvider,\n apiKeyUrl,\n )\n }\n\n // Remove duplicate function definitions - using unified fetchAnthropicCompatibleProviderModels instead\n\n async function fetchKimiModels() {\n try {\n const baseURL = providerBaseUrl || 'https://api.moonshot.cn/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n const kimiModels = models.map((model: any) => ({\n model: 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\n return kimiModels\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\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n }\n\n async function fetchDeepSeekModels() {\n try {\n const baseURL = providerBaseUrl || 'https://api.deepseek.com'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n const deepseekModels = models.map((model: any) => ({\n model: 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\n return deepseekModels\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\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n }\n\n async function fetchSiliconFlowModels() {\n try {\n const baseURL = providerBaseUrl || 'https://api.siliconflow.cn/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n const siliconflowModels = models.map((model: any) => ({\n model: 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\n return siliconflowModels\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\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n }\n\n async function fetchQwenModels() {\n try {\n const baseURL =\n providerBaseUrl || 'https://dashscope.aliyuncs.com/compatible-mode/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n const qwenModels = models.map((model: any) => ({\n model: 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\n return qwenModels\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\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n }\n\n async function fetchGLMModels() {\n try {\n const baseURL = providerBaseUrl || 'https://open.bigmodel.cn/api/paas/v4'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n const glmModels = models.map((model: any) => ({\n model: 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\n return glmModels\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\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n }\n\n async function fetchMinimaxModels() {\n try {\n const baseURL = providerBaseUrl || 'https://api.minimaxi.com/v1'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n const minimaxModels = models.map((model: any) => ({\n model: 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\n return minimaxModels\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\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n }\n\n async function fetchBaiduQianfanModels() {\n try {\n const baseURL = providerBaseUrl || 'https://qianfan.baidubce.com/v2'\n const models = await fetchCustomModels(baseURL, apiKey)\n\n const baiduModels = models.map((model: any) => ({\n model: 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\n return baiduModels\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\\n\uD83D\uDCA1 Tip: Check your internet connection and try again'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n }\n\n async function fetchCustomOpenAIModels() {\n try {\n const models = await fetchCustomModels(customBaseUrl, apiKey)\n\n const customModels = models.map((model: any) => ({\n model: 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\n return customModels\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\\n\uD83D\uDCA1 Tip: This API may not be fully OpenAI-compatible'\n }\n\n setModelLoadError(errorMessage)\n throw error\n }\n }\n\n async function fetchGeminiModels() {\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 const geminiModels = 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\n return geminiModels\n } catch (error) {\n setModelLoadError(\n error instanceof Error ? error.message : 'Unknown error',\n )\n throw error\n }\n }\n\n async function fetchOllamaModels() {\n try {\n const response = await fetch(`${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 // Properly handle Ollama API response format\n // Ollama API can return models in different formats based on version\n let models = []\n\n // Check if data field exists (newer Ollama versions)\n if (responseData.data && Array.isArray(responseData.data)) {\n models = responseData.data\n }\n // Check if models array is directly at the root (older Ollama versions)\n else if (Array.isArray(responseData.models)) {\n models = responseData.models\n }\n // If response is already an array\n else if (Array.isArray(responseData)) {\n models = responseData\n } else {\n throw new Error(\n 'Invalid response from Ollama API: missing models array',\n )\n }\n\n // Transform Ollama models to our format\n const ollamaModels = models.map((model: any) => ({\n model:\n model.name ??\n model.modelName ??\n (typeof model === 'string' ? model : ''),\n provider: 'ollama',\n max_tokens: 4096, // Default value\n supports_vision: false,\n supports_function_calling: true,\n supports_reasoning_effort: false,\n }))\n\n // Filter out models with empty names\n const validModels = ollamaModels.filter(model => model.model)\n\n setAvailableModels(validModels)\n\n // Only navigate if we have models\n if (validModels.length > 0) {\n navigateTo('model')\n } else {\n setModelLoadError('No models found in your Ollama installation')\n }\n\n return validModels\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n\n if (errorMessage.includes('fetch')) {\n setModelLoadError(\n `Could not connect to Ollama server at ${ollamaBaseUrl}. Make sure Ollama is running and the URL is correct.`,\n )\n } else {\n setModelLoadError(`Error loading Ollama models: ${errorMessage}`)\n }\n\n console.error('Error fetching Ollama models:', error)\n return []\n }\n }\n\n async function fetchModelsWithRetry() {\n const MAX_RETRIES = 2\n let lastError: Error | null = null\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n setFetchRetryCount(attempt)\n setIsRetrying(attempt > 1)\n\n if (attempt > 1) {\n // Show retry message\n setModelLoadError(\n `Attempt ${attempt}/${MAX_RETRIES}: Retrying model discovery...`,\n )\n // Wait 1 second before retrying\n await new Promise(resolve => setTimeout(resolve, 1000))\n }\n\n try {\n const models = await fetchModels()\n // Success! Reset retry state and return models\n setFetchRetryCount(0)\n setIsRetrying(false)\n setModelLoadError(null)\n return models\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n console.log(`Model fetch attempt ${attempt} failed:`, lastError.message)\n\n if (attempt === MAX_RETRIES) {\n // Final attempt failed, break to handle fallback\n break\n }\n }\n }\n\n // All retries failed, handle fallback to manual input\n setIsRetrying(false)\n const errorMessage = lastError?.message || 'Unknown error'\n\n // Check if provider supports manual input fallback\n const supportsManualInput = [\n 'anthropic',\n 'kimi',\n 'deepseek',\n 'siliconflow',\n 'qwen',\n 'glm',\n 'minimax',\n 'baidu-qianfan',\n 'custom-openai',\n ].includes(selectedProvider)\n\n if (supportsManualInput) {\n setModelLoadError(\n `Failed to auto-discover models after ${MAX_RETRIES} attempts: ${errorMessage}\\n\\n\u26A1 Automatically switching to manual model configuration...`,\n )\n\n // Automatically switch to manual input after 2 seconds\n setTimeout(() => {\n setModelLoadError(null)\n navigateTo('modelInput')\n }, 2000)\n } else {\n setModelLoadError(\n `Failed to load models after ${MAX_RETRIES} attempts: ${errorMessage}`,\n )\n }\n\n return []\n }\n\n async function fetchModels() {\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 = await fetchAnthropicCompatibleProviderModels()\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 fetchCustomOpenAIModels()\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 fetchGeminiModels()\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 fetchKimiModels()\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 fetchDeepSeekModels()\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 fetchSiliconFlowModels()\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 fetchQwenModels()\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 fetchGLMModels()\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 fetchBaiduQianfanModels()\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 modelName = (model as any).modelName || (model as any).id || (model as any).name || (model as any).model || 'unknown'\n const modelInfo = models[selectedProvider as keyof typeof models]?.find(\n m => m.model === modelName,\n )\n fetchedModels.push({\n model: modelName,\n provider: selectedProvider,\n max_tokens: modelInfo?.max_output_tokens,\n supports_vision: modelInfo?.supports_vision || false,\n supports_function_calling:\n modelInfo?.supports_function_calling || false,\n supports_reasoning_effort:\n modelInfo?.supports_reasoning_effort || false,\n })\n }\n\n setAvailableModels(fetchedModels)\n\n // Navigate to model selection screen if models were loaded successfully\n navigateTo('model')\n\n return fetchedModels\n } catch (error) {\n // Log for debugging\n console.error('Error fetching models:', error)\n\n // Re-throw the error so that fetchModelsWithRetry can handle it properly\n throw error\n } finally {\n setIsLoadingModels(false)\n }\n }\n\n function handleApiKeySubmit(key: string) {\n setApiKey(key)\n\n // For Azure, go to resource name input next\n if (selectedProvider === 'azure') {\n navigateTo('resourceName')\n return\n }\n\n // Fetch models with the provided API key\n fetchModelsWithRetry().catch(error => {\n // The retry logic in fetchModelsWithRetry already handles the error display\n // This catch is just to prevent unhandled promise rejection\n console.error('Final error after retries:', error)\n })\n }\n\n function handleResourceNameSubmit(name: string) {\n setResourceName(name)\n navigateTo('modelInput')\n }\n\n function handleOllamaBaseUrlSubmit(url: string) {\n setOllamaBaseUrl(url)\n setIsLoadingModels(true)\n setModelLoadError(null)\n\n // Use the dedicated Ollama model fetch function\n fetchOllamaModels().finally(() => {\n setIsLoadingModels(false)\n })\n }\n\n function handleCustomBaseUrlSubmit(url: string) {\n // Automatically remove trailing slash from baseURL\n const cleanUrl = url.replace(/\\/+$/, '')\n setCustomBaseUrl(cleanUrl)\n // After setting custom base URL, go to API key input\n navigateTo('apiKey')\n }\n\n function handleProviderBaseUrlSubmit(url: string) {\n // Automatically remove trailing slash from baseURL\n const cleanUrl = url.replace(/\\/+$/, '')\n setProviderBaseUrl(cleanUrl)\n\n // For Ollama, handle differently - it tries to fetch models immediately\n if (selectedProvider === 'ollama') {\n setOllamaBaseUrl(cleanUrl)\n setIsLoadingModels(true)\n setModelLoadError(null)\n\n // Use the dedicated Ollama model fetch function\n fetchOllamaModels().finally(() => {\n setIsLoadingModels(false)\n })\n } else {\n // For all other providers, go to API key input next\n navigateTo('apiKey')\n }\n }\n\n function handleAnthropicProviderSelection(\n providerType: 'official' | 'bigdream' | 'custom',\n ) {\n setAnthropicProviderType(providerType)\n\n if (providerType === 'custom') {\n // For custom Anthropic provider, go to base URL configuration\n setProviderBaseUrl('')\n navigateTo('baseUrl')\n } else {\n // For official/community proxy providers, set default base URL and go to API key\n const defaultUrls = {\n official: 'https://api.anthropic.com',\n bigdream: 'https://api-key.info',\n opendev: 'https://api.openai-next.com',\n }\n setProviderBaseUrl(defaultUrls[providerType])\n navigateTo('apiKey')\n }\n }\n\n function handleCustomModelSubmit(model: string) {\n setCustomModelName(model)\n setSelectedModel(model)\n\n // No model info available, so set default values\n setSupportsReasoningEffort(false)\n setReasoningEffort(null)\n\n // Use default max tokens for manually entered models\n setMaxTokensMode('preset')\n setSelectedMaxTokensPreset(DEFAULT_MAX_TOKENS)\n setMaxTokens(DEFAULT_MAX_TOKENS.toString())\n setMaxTokensCursorOffset(DEFAULT_MAX_TOKENS.toString().length)\n\n // Go to model parameters screen\n navigateTo('modelParams')\n // Reset active field index\n setActiveFieldIndex(0)\n }\n\n function handleModelSelection(model: string) {\n setSelectedModel(model)\n\n // Check if the selected model supports reasoning_effort\n const modelInfo = availableModels.find(m => m.model === model)\n setSupportsReasoningEffort(modelInfo?.supports_reasoning_effort || false)\n\n if (!modelInfo?.supports_reasoning_effort) {\n setReasoningEffort(null)\n }\n\n // Set max tokens based on model info or default\n if (modelInfo?.max_tokens) {\n const modelMaxTokens = modelInfo.max_tokens\n // Check if the model's max tokens matches any of our presets\n const matchingPreset = MAX_TOKENS_OPTIONS.find(\n option => option.value === modelMaxTokens,\n )\n\n if (matchingPreset) {\n setMaxTokensMode('preset')\n setSelectedMaxTokensPreset(modelMaxTokens)\n setMaxTokens(modelMaxTokens.toString())\n } else {\n setMaxTokensMode('custom')\n setMaxTokens(modelMaxTokens.toString())\n }\n setMaxTokensCursorOffset(modelMaxTokens.toString().length)\n } else {\n // No model-specific max tokens, use default\n setMaxTokensMode('preset')\n setSelectedMaxTokensPreset(DEFAULT_MAX_TOKENS)\n setMaxTokens(DEFAULT_MAX_TOKENS.toString())\n setMaxTokensCursorOffset(DEFAULT_MAX_TOKENS.toString().length)\n }\n\n // Go to model parameters screen\n navigateTo('modelParams')\n // Reset active field index\n setActiveFieldIndex(0)\n }\n\n const handleModelParamsSubmit = () => {\n // Values are already in state, no need to extract from form\n // Ensure contextLength is set to a valid option before navigating\n if (!CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength)) {\n setContextLength(DEFAULT_CONTEXT_LENGTH)\n }\n // Navigate to context length screen\n navigateTo('contextLength')\n }\n\n async function testConnection(): Promise<{\n success: boolean\n message: string\n endpoint?: string\n details?: string\n }> {\n setIsTestingConnection(true)\n setConnectionTestResult(null)\n\n try {\n // Determine the base URL to test\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 // For OpenAI-compatible providers, try multiple endpoints in order of preference\n const isOpenAICompatible = [\n 'minimax',\n 'kimi',\n 'deepseek',\n 'siliconflow',\n 'qwen',\n 'glm',\n 'baidu-qianfan',\n 'openai',\n 'mistral',\n 'xai',\n 'groq',\n 'custom-openai',\n ].includes(selectedProvider)\n\n if (isOpenAICompatible) {\n // \uD83D\uDD25 Use specialized GPT-5 connection test for GPT-5 models\n const isGPT5 = selectedModel?.toLowerCase().includes('gpt-5')\n \n if (isGPT5) {\n console.log(`\uD83D\uDE80 Using specialized GPT-5 connection test for model: ${selectedModel}`)\n \n // Validate configuration first\n const configValidation = validateGPT5Config({\n model: selectedModel,\n apiKey: apiKey,\n baseURL: testBaseURL,\n maxTokens: parseInt(maxTokens) || 8192,\n provider: selectedProvider,\n })\n \n if (!configValidation.valid) {\n return {\n success: false,\n message: '\u274C GPT-5 configuration validation failed',\n details: configValidation.errors.join('\\n'),\n }\n }\n \n // Use specialized GPT-5 test service\n const gpt5Result = await testGPT5Connection({\n model: selectedModel,\n apiKey: apiKey,\n baseURL: testBaseURL,\n maxTokens: parseInt(maxTokens) || 8192,\n provider: selectedProvider,\n })\n \n return gpt5Result\n }\n \n // For non-GPT-5 OpenAI-compatible models, use existing logic\n const endpointsToTry = []\n\n if (selectedProvider === 'minimax') {\n endpointsToTry.push(\n {\n path: '/text/chatcompletion_v2',\n name: 'MiniMax v2 (recommended)',\n },\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 = null\n for (const endpoint of endpointsToTry) {\n try {\n const testResult = await testChatEndpoint(\n testBaseURL,\n endpoint.path,\n endpoint.name,\n )\n \n if (testResult.success) {\n return testResult\n }\n lastError = testResult\n } catch (error) {\n lastError = {\n success: false,\n message: `Failed to test ${endpoint.name}`,\n endpoint: endpoint.path,\n details: error instanceof Error ? error.message : String(error),\n }\n }\n }\n\n return (\n lastError || {\n success: false,\n message: 'All endpoints failed',\n details: 'No endpoints could be reached',\n }\n )\n } else {\n // For non-OpenAI providers (like Anthropic, Gemini), use different test approach\n return await testProviderSpecificEndpoint(testBaseURL)\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 } finally {\n setIsTestingConnection(false)\n }\n }\n\n async function testChatEndpoint(\n baseURL: string,\n endpointPath: string,\n endpointName: string,\n ): Promise<{\n success: boolean\n message: string\n endpoint?: string\n details?: string\n }> {\n const testURL = `${baseURL.replace(/\\/+$/, '')}${endpointPath}`\n\n // Create a test message that expects a specific response\n const testPayload: any = {\n model: selectedModel,\n messages: [\n {\n role: 'user',\n content:\n 'Please respond with exactly \"YES\" (in capital letters) to confirm this connection is working.',\n },\n ],\n max_tokens: Math.max(parseInt(maxTokens) || 8192, 8192), // Ensure minimum 8192 tokens for connection test\n temperature: 0,\n stream: false,\n }\n\n // GPT-5 parameter compatibility fix\n if (selectedModel && selectedModel.toLowerCase().includes('gpt-5')) {\n console.log(`Applying GPT-5 parameter fix for model: ${selectedModel}`)\n \n // GPT-5 requires max_completion_tokens instead of max_tokens\n if (testPayload.max_tokens) {\n testPayload.max_completion_tokens = testPayload.max_tokens\n delete testPayload.max_tokens\n console.log(`Transformed max_tokens \u2192 max_completion_tokens: ${testPayload.max_completion_tokens}`)\n }\n \n // GPT-5 temperature handling - ensure it's 1 or undefined\n if (testPayload.temperature !== undefined && testPayload.temperature !== 1) {\n console.log(`Adjusting temperature from ${testPayload.temperature} to 1 for GPT-5`)\n testPayload.temperature = 1\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Add authorization headers\n if (selectedProvider === 'azure') {\n headers['api-key'] = apiKey\n } else {\n headers['Authorization'] = `Bearer ${apiKey}`\n }\n\n try {\n const response = await fetch(testURL, {\n method: 'POST',\n headers,\n body: JSON.stringify(testPayload),\n })\n\n if (response.ok) {\n const data = await response.json()\n console.log(\n '[DEBUG] Connection test response:',\n JSON.stringify(data, null, 2),\n )\n\n // Check if we got a valid response with content\n let responseContent = ''\n\n if (data.choices && data.choices.length > 0) {\n responseContent = data.choices[0]?.message?.content || ''\n } else if (data.reply) {\n // Handle MiniMax format\n responseContent = data.reply\n } else if (data.output) {\n // Handle other formats\n responseContent = data.output?.text || data.output || ''\n }\n\n console.log('[DEBUG] Extracted response content:', responseContent)\n\n // Check if response contains \"YES\" (case insensitive)\n const containsYes = responseContent.toLowerCase().includes('yes')\n\n if (containsYes) {\n return {\n success: true,\n message: `\u2705 Connection test passed with ${endpointName}`,\n endpoint: endpointPath,\n details: `Model responded correctly: \"${responseContent.trim()}\"`,\n }\n } else {\n return {\n success: false,\n message: `\u26A0\uFE0F ${endpointName} connected but model response unexpected`,\n endpoint: endpointPath,\n details: `Expected \"YES\" but got: \"${responseContent.trim() || '(empty response)'}\"`,\n }\n }\n } else {\n const errorData = await response.json().catch(() => null)\n const errorMessage =\n errorData?.error?.message || errorData?.message || response.statusText\n\n return {\n success: false,\n message: `\u274C ${endpointName} failed (${response.status})`,\n endpoint: endpointPath,\n details: `Error: ${errorMessage}`,\n }\n }\n } catch (error) {\n return {\n success: false,\n message: `\u274C ${endpointName} connection failed`,\n endpoint: endpointPath,\n details: error instanceof Error ? error.message : String(error),\n }\n }\n }\n\n async function testResponsesEndpoint(\n baseURL: string,\n endpointPath: string,\n endpointName: string,\n ): Promise<{\n success: boolean\n message: string\n endpoint?: string\n details?: string\n }> {\n const testURL = `${baseURL.replace(/\\/+$/, '')}${endpointPath}`\n\n // \uD83D\uDD27 Enhanced GPT-5 Responses API test payload\n const testPayload: any = {\n model: selectedModel,\n input: [\n {\n role: 'user',\n content:\n 'Please respond with exactly \"YES\" (in capital letters) to confirm this connection is working.',\n },\n ],\n max_completion_tokens: Math.max(parseInt(maxTokens) || 8192, 8192),\n temperature: 1, // GPT-5 only supports temperature=1\n // \uD83D\uDE80 Add reasoning configuration for better GPT-5 performance\n reasoning: {\n effort: 'low', // Fast response for connection test\n },\n }\n\n console.log(`\uD83D\uDD27 Testing GPT-5 Responses API for model: ${selectedModel}`)\n console.log(`\uD83D\uDD27 Test URL: ${testURL}`)\n console.log(`\uD83D\uDD27 Test payload:`, JSON.stringify(testPayload, null, 2))\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n }\n\n try {\n const response = await fetch(testURL, {\n method: 'POST',\n headers,\n body: JSON.stringify(testPayload),\n })\n\n if (response.ok) {\n const data = await response.json()\n console.log(\n '[DEBUG] Responses API connection test response:',\n JSON.stringify(data, null, 2),\n )\n\n // Extract content from Responses API format\n let responseContent = ''\n \n if (data.output_text) {\n responseContent = data.output_text\n } else if (data.output) {\n responseContent = typeof data.output === 'string' ? data.output : data.output.text || ''\n }\n\n console.log('[DEBUG] Extracted response content:', responseContent)\n\n // Check if response contains \"YES\" (case insensitive)\n const containsYes = responseContent.toLowerCase().includes('yes')\n\n if (containsYes) {\n return {\n success: true,\n message: `\u2705 Connection test passed with ${endpointName}`,\n endpoint: endpointPath,\n details: `GPT-5 responded correctly via Responses API: \"${responseContent.trim()}\"`,\n }\n } else {\n return {\n success: false,\n message: `\u26A0\uFE0F ${endpointName} connected but model response unexpected`,\n endpoint: endpointPath,\n details: `Expected \"YES\" but got: \"${responseContent.trim() || '(empty response)'}\"`,\n }\n }\n } else {\n // \uD83D\uDD27 Enhanced error handling with detailed debugging\n const errorData = await response.json().catch(() => null)\n const errorMessage =\n errorData?.error?.message || errorData?.message || response.statusText\n \n console.log(`\uD83D\uDEA8 GPT-5 Responses API Error (${response.status}):`, errorData)\n \n // \uD83D\uDD27 Provide specific guidance for common GPT-5 errors\n let details = `Responses API Error: ${errorMessage}`\n if (response.status === 400 && errorMessage.includes('max_tokens')) {\n details += '\\n\uD83D\uDD27 Note: This appears to be a parameter compatibility issue. The fallback to Chat Completions should handle this.'\n } else if (response.status === 404) {\n details += '\\n\uD83D\uDD27 Note: Responses API endpoint may not be available for this model or provider.'\n } else if (response.status === 401) {\n details += '\\n\uD83D\uDD27 Note: API key authentication failed.'\n }\n \n return {\n success: false,\n message: `\u274C ${endpointName} failed (${response.status})`,\n endpoint: endpointPath,\n details: details,\n }\n }\n } catch (error) {\n return {\n success: false,\n message: `\u274C ${endpointName} connection failed`,\n endpoint: endpointPath,\n details: error instanceof Error ? error.message : String(error),\n }\n }\n }\n\n async function testProviderSpecificEndpoint(baseURL: string): Promise<{\n success: boolean\n message: string\n endpoint?: string\n details?: string\n }> {\n // For Anthropic and Anthropic-compatible providers, use the official SDK for testing\n if (selectedProvider === 'anthropic' || selectedProvider === 'bigdream') {\n try {\n console.log(\n `[DEBUG] Testing ${selectedProvider} connection using official Anthropic SDK...`,\n )\n\n // Determine the baseURL for testing\n let testBaseURL: string | undefined = undefined\n if (selectedProvider === 'bigdream') {\n testBaseURL = baseURL || 'https://api-key.info'\n } else if (selectedProvider === 'anthropic') {\n // For anthropic, use user-provided baseURL if available, otherwise undefined (official API)\n testBaseURL =\n baseURL && baseURL !== 'https://api.anthropic.com'\n ? baseURL\n : undefined\n }\n\n // Use the verifyApiKey function which uses the official Anthropic SDK\n const isValid = await verifyApiKey(apiKey, testBaseURL, selectedProvider)\n\n if (isValid) {\n return {\n success: true,\n message: `\u2705 ${selectedProvider} connection test passed`,\n endpoint: '/messages',\n details: 'API key verified using official Anthropic SDK',\n }\n } else {\n return {\n success: false,\n message: `\u274C ${selectedProvider} API key verification failed`,\n endpoint: '/messages',\n details:\n 'Invalid API key. Please check your API key and try again.',\n }\n }\n } catch (error) {\n console.log(`[DEBUG] ${selectedProvider} connection test error:`, error)\n return {\n success: false,\n message: `\u274C ${selectedProvider} connection failed`,\n endpoint: '/messages',\n details: error instanceof Error ? error.message : String(error),\n }\n }\n }\n\n // For other providers, return a placeholder success (we can extend this later)\n return {\n success: true,\n message: `\u2705 Configuration saved for ${selectedProvider}`,\n details: 'Provider-specific testing not implemented yet',\n }\n }\n\n async function handleConnectionTest() {\n const result = await testConnection()\n setConnectionTestResult(result)\n\n if (result.success) {\n // Auto-advance to confirmation after a short delay\n setTimeout(() => {\n navigateTo('confirmation')\n }, 2000)\n }\n }\n\n const handleContextLengthSubmit = () => {\n // Context length value is already in state\n // Navigate to connection test screen\n navigateTo('connectionTest')\n }\n\n async function saveConfiguration(\n provider: ProviderType,\n model: string,\n ): Promise<string | null> {\n let baseURL = providerBaseUrl || providers[provider]?.baseURL || ''\n let actualProvider = provider\n\n // For Anthropic provider, determine the actual provider based on sub-menu selection\n if (provider === 'anthropic') {\n switch (anthropicProviderType) {\n case 'official':\n actualProvider = 'anthropic'\n baseURL = baseURL || 'https://api.anthropic.com'\n break\n case 'bigdream':\n actualProvider = 'bigdream'\n baseURL = baseURL || 'https://api-key.info'\n break\n case 'custom':\n actualProvider = 'anthropic' // Use anthropic for custom endpoints\n // baseURL is already set from user input\n break\n }\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 try {\n // Use ModelManager's addModel method for duplicate validation\n const modelManager = getModelManager()\n\n const modelConfig = {\n name: `${actualProvider} ${model}`,\n provider: actualProvider,\n modelName: model,\n baseURL: baseURL,\n apiKey: apiKey || '',\n maxTokens: parseInt(maxTokens) || DEFAULT_MAX_TOKENS,\n contextLength: contextLength || DEFAULT_CONTEXT_LENGTH,\n reasoningEffort,\n }\n\n // addModel method will throw error if duplicate exists\n return await modelManager.addModel(modelConfig)\n } catch (error) {\n // Validation failed - show error to user\n setValidationError(\n error instanceof Error ? error.message : 'Failed to add model',\n )\n return null\n }\n }\n\n async function handleConfirmation() {\n // Clear any previous validation errors\n setValidationError(null)\n\n // Save the configuration and exit\n const modelId = await saveConfiguration(selectedProvider, selectedModel)\n\n // If validation failed (modelId is null), don't proceed\n if (!modelId) {\n return // Error is already set in saveConfiguration\n }\n\n // Handle model pointer assignment for new system\n if (modelId && (isOnboarding || targetPointer)) {\n if (isOnboarding) {\n // First-time setup: set all pointers to this model\n setAllPointersToModel(modelId)\n } else if (targetPointer) {\n // Specific pointer configuration: only set target pointer\n setModelPointer(targetPointer, modelId)\n }\n }\n\n onDone()\n }\n\n // Handle back navigation based on current screen\n const handleBack = () => {\n if (currentScreen === 'provider') {\n // If we're at the first screen, exit\n if (onCancel) {\n onCancel()\n } else {\n onDone()\n }\n } else {\n // Remove the current screen from the stack\n setScreenStack(prev => prev.slice(0, -1))\n }\n }\n\n // Use escape navigation hook\n useEscapeNavigation(handleBack, abortController)\n\n // Handle cursor offset changes\n function handleCursorOffsetChange(offset: number) {\n setCursorOffset(offset)\n }\n\n // Handle API key changes\n function handleApiKeyChange(value: string) {\n setApiKeyEdited(true)\n setApiKey(value)\n }\n\n // Handle model search query changes\n function handleModelSearchChange(value: string) {\n setModelSearchQuery(value)\n // Update cursor position to end of text when typing\n setModelSearchCursorOffset(value.length)\n }\n\n // Handle model search cursor offset changes\n function handleModelSearchCursorOffsetChange(offset: number) {\n setModelSearchCursorOffset(offset)\n }\n\n // Handle input for Resource Name screen\n useInput((input, key) => {\n // Handle API key submission on Enter\n if (currentScreen === 'apiKey' && key.return) {\n if (apiKey) {\n handleApiKeySubmit(apiKey)\n }\n return\n }\n\n if (currentScreen === 'apiKey' && key.tab) {\n // For providers that support manual model input, skip to manual model input\n if (\n selectedProvider === 'anthropic' ||\n selectedProvider === 'kimi' ||\n selectedProvider === 'deepseek' ||\n selectedProvider === 'qwen' ||\n selectedProvider === 'glm' ||\n selectedProvider === 'minimax' ||\n selectedProvider === 'baidu-qianfan' ||\n selectedProvider === 'siliconflow' ||\n selectedProvider === 'custom-openai'\n ) {\n navigateTo('modelInput')\n return\n }\n\n // For other providers, try to fetch models without API key\n fetchModelsWithRetry().catch(error => {\n // The retry logic in fetchModelsWithRetry already handles the error display\n // This catch is just to prevent unhandled promise rejection\n console.error('Final error after retries:', error)\n })\n return\n }\n\n // Handle Resource Name submission on Enter\n if (currentScreen === 'resourceName' && key.return) {\n if (resourceName) {\n handleResourceNameSubmit(resourceName)\n }\n return\n }\n\n // Handle Base URL submission on Enter\n if (currentScreen === 'baseUrl' && key.return) {\n if (selectedProvider === 'custom-openai') {\n handleCustomBaseUrlSubmit(customBaseUrl)\n } else {\n // For all other providers (including ollama), use the general handler\n handleProviderBaseUrlSubmit(providerBaseUrl)\n }\n return\n }\n\n // Handle Custom Model Name submission on Enter\n if (currentScreen === 'modelInput' && key.return) {\n if (customModelName) {\n handleCustomModelSubmit(customModelName)\n }\n return\n }\n\n // Handle confirmation on Enter\n if (currentScreen === 'confirmation' && key.return) {\n handleConfirmation().catch(error => {\n console.error('Error in handleConfirmation:', error)\n setValidationError(\n error instanceof Error ? error.message : 'Unexpected error occurred',\n )\n })\n return\n }\n\n // Handle connection test\n if (currentScreen === 'connectionTest') {\n if (key.return) {\n if (!isTestingConnection && !connectionTestResult) {\n handleConnectionTest()\n } else if (connectionTestResult && connectionTestResult.success) {\n navigateTo('confirmation')\n } else if (connectionTestResult && !connectionTestResult.success) {\n // Retry the test\n handleConnectionTest()\n }\n return\n }\n }\n\n // Handle context length selection\n if (currentScreen === 'contextLength') {\n if (key.return) {\n handleContextLengthSubmit()\n return\n }\n\n if (key.upArrow) {\n const currentIndex = CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === 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 setContextLength(CONTEXT_LENGTH_OPTIONS[newIndex].value)\n return\n }\n\n if (key.downArrow) {\n const currentIndex = CONTEXT_LENGTH_OPTIONS.findIndex(\n opt => opt.value === 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 setContextLength(CONTEXT_LENGTH_OPTIONS[newIndex].value)\n return\n }\n }\n\n // Handle paste event (Ctrl+V or Cmd+V)\n if (\n currentScreen === 'apiKey' &&\n ((key.ctrl && input === 'v') || (key.meta && input === 'v'))\n ) {\n // We can't directly access clipboard in terminal, but we can show a message\n setModelLoadError(\n \"Please use your terminal's paste functionality or type the API key manually\",\n )\n return\n }\n\n // Handle Tab key for form navigation in model params screen\n if (currentScreen === 'modelParams' && key.tab) {\n const formFields = getFormFieldsForModelParams()\n // Move to next field\n setActiveFieldIndex(current => (current + 1) % formFields.length)\n return\n }\n\n // Handle Enter key for form submission in model params screen\n if (currentScreen === 'modelParams' && key.return) {\n const formFields = getFormFieldsForModelParams()\n const currentField = formFields[activeFieldIndex]\n\n if (\n currentField.name === 'submit' ||\n activeFieldIndex === formFields.length - 1\n ) {\n // If on the Continue button, submit the form\n handleModelParamsSubmit()\n } else if (currentField.component === 'select') {\n // For select fields, move to the next field (since selection should be handled by Select component)\n setActiveFieldIndex(current =>\n Math.min(current + 1, formFields.length - 1),\n )\n }\n return\n }\n })\n\n // Helper function to get form fields for model params\n function getFormFieldsForModelParams() {\n return [\n {\n name: 'maxTokens',\n label: 'Maximum Tokens',\n description: 'Select the maximum number of tokens to generate.',\n value: parseInt(maxTokens),\n component: 'select',\n options: MAX_TOKENS_OPTIONS.map(option => ({\n label: option.label,\n value: option.value.toString(),\n })),\n defaultValue: maxTokens,\n },\n ...(supportsReasoningEffort\n ? [\n {\n name: 'reasoningEffort',\n label: 'Reasoning Effort',\n description: 'Controls reasoning depth for complex problems.',\n value: reasoningEffort,\n component: 'select',\n },\n ]\n : []),\n {\n name: 'submit',\n label: 'Continue \u2192',\n component: 'button',\n },\n ]\n }\n\n // Render API Key Input Screen\n if (currentScreen === 'apiKey') {\n const modelTypeText = 'this model profile'\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n API Key Setup{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n Enter your {getProviderLabel(selectedProvider, 0).split(' (')[0]}{' '}\n API key for {modelTypeText}:\n </Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This key will be stored locally and used to access the{' '}\n {selectedProvider} API.\n <Newline />\n Your key is never sent to our servers.\n <Newline />\n <Newline />\n {selectedProvider === 'kimi' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.moonshot.cn/console/api-keys\n </Text>\n </>\n )}\n {selectedProvider === 'deepseek' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.deepseek.com/api_keys\n </Text>\n </>\n )}\n {selectedProvider === 'siliconflow' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://cloud.siliconflow.cn/i/oJWsm6io\n </Text>\n </>\n )}\n {selectedProvider === 'qwen' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://bailian.console.aliyun.com/?tab=model#/api-key\n </Text>\n </>\n )}\n {selectedProvider === 'glm' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://open.bigmodel.cn (API Keys section)\n </Text>\n </>\n )}\n {selectedProvider === 'minimax' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://www.minimax.io/platform/user-center/basic-information\n </Text>\n </>\n )}\n {selectedProvider === 'baidu-qianfan' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://console.bce.baidu.com/iam/#/iam/accesslist\n </Text>\n </>\n )}\n {selectedProvider === 'anthropic' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n {anthropicProviderType === 'official'\n ? 'https://console.anthropic.com/settings/keys'\n : anthropicProviderType === 'bigdream'\n ? 'https://api-key.info/register?aff=MSl4'\n : anthropicProviderType === 'opendev'\n ? 'https://api.openai-next.com/register/?aff_code=4xo7'\n : 'your custom API provider'}\n </Text>\n </>\n )}\n {selectedProvider === 'openai' && (\n <>\n \uD83D\uDCA1 Get your API key from:{' '}\n <Text color={theme.suggestion}>\n https://platform.openai.com/api-keys\n </Text>\n </>\n )}\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder=\"sk-...\"\n value={apiKey}\n onChange={handleApiKeyChange}\n onSubmit={handleApiKeySubmit}\n mask=\"*\"\n columns={500}\n cursorOffset={cursorOffset}\n onChangeCursorOffset={handleCursorOffsetChange}\n showCursor={true}\n />\n </Box>\n\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 or click to continue with this API key\n </Text>\n </Text>\n </Box>\n\n {isLoadingModels && (\n <Box>\n <Text color={theme.suggestion}>\n Loading available models...\n </Text>\n </Box>\n )}\n {modelLoadError && (\n <Box>\n <Text color=\"red\">Error: {modelLoadError}</Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue,{' '}\n <Text color={theme.suggestion}>Tab</Text> to{' '}\n {selectedProvider === 'anthropic' ||\n selectedProvider === 'kimi' ||\n selectedProvider === 'deepseek' ||\n selectedProvider === 'qwen' ||\n selectedProvider === 'glm' ||\n selectedProvider === 'minimax' ||\n selectedProvider === 'baidu-qianfan' ||\n selectedProvider === 'siliconflow' ||\n selectedProvider === 'custom-openai'\n ? 'skip to manual model input'\n : 'skip using a key'}\n , or <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // Render Model Selection Screen\n if (currentScreen === 'model') {\n const modelTypeText = 'this model profile'\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Model Selection{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n Select a model from{' '}\n {\n getProviderLabel(\n selectedProvider,\n availableModels.length,\n ).split(' (')[0]\n }{' '}\n for {modelTypeText}:\n </Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This model profile can be assigned to different pointers (main,\n task, reasoning, quick) for various use cases.\n </Text>\n </Box>\n\n <Box marginY={1}>\n <Text bold>Search models:</Text>\n <TextInput\n placeholder=\"Type to filter models...\"\n value={modelSearchQuery}\n onChange={handleModelSearchChange}\n columns={100}\n cursorOffset={modelSearchCursorOffset}\n onChangeCursorOffset={handleModelSearchCursorOffsetChange}\n showCursor={true}\n focus={true}\n />\n </Box>\n\n {modelOptions.length > 0 ? (\n <>\n <Select\n options={modelOptions}\n onChange={handleModelSelection}\n />\n <Text dimColor>\n Showing {modelOptions.length} of {availableModels.length}{' '}\n models\n </Text>\n </>\n ) : (\n <Box>\n {availableModels.length > 0 ? (\n <Text color=\"yellow\">\n No models match your search. Try a different query.\n </Text>\n ) : (\n <Text color=\"yellow\">\n No models available for this provider.\n </Text>\n )}\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\n API key input\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n if (currentScreen === 'modelParams') {\n // Define form fields\n const formFields = getFormFieldsForModelParams()\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Model Parameters{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Configure parameters for {selectedModel}:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n Use <Text color={theme.suggestion}>Tab</Text> to navigate\n between fields. Press{' '}\n <Text color={theme.suggestion}>Enter</Text> to submit.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\">\n {formFields.map((field, index) => (\n <Box flexDirection=\"column\" marginY={1} key={field.name}>\n {field.component !== 'button' ? (\n <>\n <Text\n bold\n color={\n activeFieldIndex === index ? theme.success : undefined\n }\n >\n {field.label}\n </Text>\n {field.description && (\n <Text color={theme.secondaryText}>\n {field.description}\n </Text>\n )}\n </>\n ) : (\n <Text\n bold\n color={\n activeFieldIndex === index ? theme.success : undefined\n }\n >\n {field.label}\n </Text>\n )}\n <Box marginY={1}>\n {activeFieldIndex === index ? (\n field.component === 'select' ? (\n field.name === 'maxTokens' ? (\n <Select\n options={field.options || []}\n onChange={value => {\n const numValue = parseInt(value)\n setMaxTokens(numValue.toString())\n setSelectedMaxTokensPreset(numValue)\n setMaxTokensCursorOffset(\n numValue.toString().length,\n )\n // Move to next field after selection\n setTimeout(() => {\n setActiveFieldIndex(index + 1)\n }, 100)\n }}\n defaultValue={field.defaultValue}\n />\n ) : (\n <Select\n options={reasoningEffortOptions}\n onChange={value => {\n setReasoningEffort(value as ReasoningEffortOption)\n // Move to next field after selection\n setTimeout(() => {\n setActiveFieldIndex(index + 1)\n }, 100)\n }}\n defaultValue={reasoningEffort}\n />\n )\n ) : null\n ) : field.name === 'maxTokens' ? (\n <Text color={theme.secondaryText}>\n Current:{' '}\n <Text color={theme.suggestion}>\n {MAX_TOKENS_OPTIONS.find(\n opt => opt.value === parseInt(maxTokens),\n )?.label || `${maxTokens} tokens`}\n </Text>\n </Text>\n ) : field.name === 'reasoningEffort' ? (\n <Text color={theme.secondaryText}>\n Current:{' '}\n <Text color={theme.suggestion}>{reasoningEffort}</Text>\n </Text>\n ) : null}\n </Box>\n </Box>\n ))}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Tab</Text> to navigate,{' '}\n <Text color={theme.suggestion}>Enter</Text> to continue, or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // Render Resource Name Input Screen\n if (currentScreen === 'resourceName') {\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Azure Resource Setup{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Enter your Azure OpenAI resource name:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This is the name of your Azure OpenAI resource (without the full\n domain).\n <Newline />\n For example, if your endpoint is\n \"https://myresource.openai.azure.com\", enter \"myresource\".\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder=\"myazureresource\"\n value={resourceName}\n onChange={setResourceName}\n onSubmit={handleResourceNameSubmit}\n columns={100}\n cursorOffset={resourceNameCursorOffset}\n onChangeCursorOffset={setResourceNameCursorOffset}\n showCursor={true}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion} dimColor={!resourceName}>\n [Submit Resource Name]\n </Text>\n <Text> - Press Enter or click to continue</Text>\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // Render Base URL Input Screen (for all providers)\n if (currentScreen === 'baseUrl') {\n const isCustomOpenAI = selectedProvider === 'custom-openai'\n\n // For custom-openai, we still use the old logic with customBaseUrl\n if (isCustomOpenAI) {\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Custom API Server Setup{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Enter your custom API URL:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This is the base URL for your OpenAI-compatible API.\n <Newline />\n For example: https://api.example.com/v1\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder=\"https://api.example.com/v1\"\n value={customBaseUrl}\n onChange={setCustomBaseUrl}\n onSubmit={handleCustomBaseUrlSubmit}\n columns={100}\n cursorOffset={customBaseUrlCursorOffset}\n onChangeCursorOffset={setCustomBaseUrlCursorOffset}\n showCursor={!isLoadingModels}\n focus={!isLoadingModels}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text>\n <Text\n color={\n isLoadingModels ? theme.secondaryText : theme.suggestion\n }\n >\n [Submit Base URL]\n </Text>\n <Text> - Press Enter or click to continue</Text>\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue\n or <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // For all other providers, use the new general provider URL configuration\n const providerName = providers[selectedProvider]?.name || selectedProvider\n const defaultUrl = providers[selectedProvider]?.baseURL || ''\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n {providerName} API Configuration{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Configure the API endpoint for {providerName}:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n {selectedProvider === 'ollama' ? (\n <>\n This is the URL of your Ollama server.\n <Newline />\n Default is http://localhost:11434/v1 for local Ollama\n installations.\n </>\n ) : (\n <>\n This is the base URL for the {providerName} API.\n <Newline />\n You can modify this URL or press Enter to use the default.\n </>\n )}\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder={defaultUrl}\n value={providerBaseUrl}\n onChange={setProviderBaseUrl}\n onSubmit={handleProviderBaseUrlSubmit}\n columns={100}\n cursorOffset={providerBaseUrlCursorOffset}\n onChangeCursorOffset={setProviderBaseUrlCursorOffset}\n showCursor={!isLoadingModels}\n focus={!isLoadingModels}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text>\n <Text\n color={\n isLoadingModels ? theme.secondaryText : theme.suggestion\n }\n >\n [Submit Base URL]\n </Text>\n <Text> - Press Enter or click to continue</Text>\n </Text>\n </Box>\n\n {isLoadingModels && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n {selectedProvider === 'ollama'\n ? 'Connecting to Ollama server...'\n : `Connecting to ${providerName}...`}\n </Text>\n </Box>\n )}\n\n {modelLoadError && (\n <Box marginTop={1}>\n <Text color=\"red\">Error: {modelLoadError}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // Render Custom Model Input Screen\n if (currentScreen === 'modelInput') {\n const modelTypeText = 'this model profile'\n\n // Determine the screen title and description based on provider\n let screenTitle = 'Manual Model Setup'\n let description = 'Enter the model name manually'\n let placeholder = 'gpt-4'\n let examples = 'For example: \"gpt-4\", \"gpt-3.5-turbo\", etc.'\n\n if (selectedProvider === 'azure') {\n screenTitle = 'Azure Model Setup'\n description = `Enter your Azure OpenAI deployment name for ${modelTypeText}:`\n examples = 'For example: \"gpt-4\", \"gpt-35-turbo\", etc.'\n placeholder = 'gpt-4'\n } else if (selectedProvider === 'anthropic') {\n screenTitle = 'Claude Model Setup'\n description = `Enter the Claude 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 === '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 === 'baidu-qianfan') {\n screenTitle = 'Baidu Qianfan Model Setup'\n description = `Enter the Baidu Qianfan model name for ${modelTypeText}:`\n examples =\n 'For example: \"ERNIE-4.0-8K\", \"ERNIE-3.5-8K\", \"ERNIE-Speed-128K\", etc.'\n placeholder = 'ERNIE-4.0-8K'\n } else if (selectedProvider === 'custom-openai') {\n screenTitle = 'Custom API Model Setup'\n description = `Enter the model name for ${modelTypeText}:`\n examples = 'Enter the exact model name as supported by your API endpoint.'\n placeholder = 'model-name'\n }\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n {screenTitle}{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>{description}</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n {selectedProvider === 'azure'\n ? 'This is the deployment name you configured in your Azure OpenAI resource.'\n : selectedProvider === 'anthropic'\n ? 'This should be a valid Claude model identifier from Claude.'\n : selectedProvider === 'bigdream'\n ? 'This should be a valid Claude model identifier supported by BigDream.'\n : selectedProvider === 'kimi'\n ? 'This should be a valid Kimi model identifier from Moonshot AI.'\n : selectedProvider === 'deepseek'\n ? 'This should be a valid DeepSeek model identifier.'\n : selectedProvider === 'siliconflow'\n ? 'This should be a valid SiliconFlow model identifier.'\n : selectedProvider === 'qwen'\n ? 'This should be a valid Qwen model identifier from Alibaba Cloud.'\n : selectedProvider === 'glm'\n ? 'This should be a valid GLM model identifier from Zhipu AI.'\n : selectedProvider === 'minimax'\n ? 'This should be a valid MiniMax model identifier.'\n : selectedProvider === 'baidu-qianfan'\n ? 'This should be a valid Baidu Qianfan model identifier.'\n : 'This should match the model name supported by your API endpoint.'}\n <Newline />\n {examples}\n </Text>\n </Box>\n\n <Box>\n <TextInput\n placeholder={placeholder}\n value={customModelName}\n onChange={setCustomModelName}\n onSubmit={handleCustomModelSubmit}\n columns={100}\n cursorOffset={customModelNameCursorOffset}\n onChangeCursorOffset={setCustomModelNameCursorOffset}\n showCursor={true}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion} dimColor={!customModelName}>\n [Submit Model Name]\n </Text>\n <Text> - Press Enter or click to continue</Text>\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Enter</Text> to continue or{' '}\n <Text color={theme.suggestion}>Esc</Text> to go back\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // Render Context Length Selection Screen\n if (currentScreen === 'contextLength') {\n const selectedOption =\n CONTEXT_LENGTH_OPTIONS.find(opt => opt.value === contextLength) ||\n CONTEXT_LENGTH_OPTIONS[2] // Default to 128K\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Context Length Configuration{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Choose the context window length for your model:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This determines how much conversation history and context the\n model can process at once. Higher values allow for longer\n conversations but may increase costs.\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n {CONTEXT_LENGTH_OPTIONS.map((option, index) => {\n const isSelected = option.value === contextLength\n return (\n <Box key={option.value} flexDirection=\"row\">\n <Text color={isSelected ? 'blue' : undefined}>\n {isSelected ? '\u2192 ' : ' '}\n {option.label}\n {option.value === DEFAULT_CONTEXT_LENGTH\n ? ' (recommended)'\n : ''}\n </Text>\n </Box>\n )\n })}\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n <Text dimColor>\n Selected:{' '}\n <Text color={theme.suggestion}>{selectedOption.label}</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n\n <Box marginLeft={1}>\n <Text dimColor>\n \u2191/\u2193 to select \u00B7 Enter to continue \u00B7 Esc to go back\n </Text>\n </Box>\n </Box>\n )\n }\n\n // Render Connection Test Screen\n if (currentScreen === 'connectionTest') {\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\n ' (',\n )[0]\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Connection Test{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Testing connection to {providerDisplayName}...</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n This will verify your configuration by sending a test request to\n the API.\n {selectedProvider === 'minimax' && (\n <>\n <Newline />\n For MiniMax, we'll test both v2 and v1 endpoints to find the\n best one.\n </>\n )}\n </Text>\n </Box>\n\n {!connectionTestResult && !isTestingConnection && (\n <Box marginY={1}>\n <Text>\n <Text color={theme.suggestion}>Press Enter</Text> to start the\n connection test\n </Text>\n </Box>\n )}\n\n {isTestingConnection && (\n <Box marginY={1}>\n <Text color={theme.suggestion}>\uD83D\uDD04 Testing connection...</Text>\n </Box>\n )}\n\n {connectionTestResult && (\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\n <Text\n color={connectionTestResult.success ? theme.success : 'red'}\n >\n {connectionTestResult.message}\n </Text>\n\n {connectionTestResult.endpoint && (\n <Text color={theme.secondaryText}>\n Endpoint: {connectionTestResult.endpoint}\n </Text>\n )}\n\n {connectionTestResult.details && (\n <Text color={theme.secondaryText}>\n Details: {connectionTestResult.details}\n </Text>\n )}\n\n {connectionTestResult.success ? (\n <Box marginTop={1}>\n <Text color={theme.success}>\n \u2705 Automatically proceeding to confirmation...\n </Text>\n </Box>\n ) : (\n <Box marginTop={1}>\n <Text>\n <Text color={theme.suggestion}>Press Enter</Text> to retry\n test, or <Text color={theme.suggestion}>Esc</Text> to go\n back\n </Text>\n </Box>\n )}\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\n context length\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // Render Confirmation Screen\n if (currentScreen === 'confirmation') {\n // Show model profile being created\n\n // Get provider display name\n const providerDisplayName = getProviderLabel(selectedProvider, 0).split(\n ' (',\n )[0]\n\n // Determine if provider requires API key\n const showsApiKey = selectedProvider !== 'ollama'\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Configuration Confirmation{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>Confirm your model configuration:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n Please review your selections before saving.\n </Text>\n </Box>\n\n {validationError && (\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\n <Text color={theme.error} bold>\n \u26A0 Configuration Error:\n </Text>\n <Text color={theme.error}>{validationError}</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginY={1} paddingX={1}>\n <Text>\n <Text bold>Provider: </Text>\n <Text color={theme.suggestion}>{providerDisplayName}</Text>\n </Text>\n\n {selectedProvider === 'azure' && (\n <Text>\n <Text bold>Resource Name: </Text>\n <Text color={theme.suggestion}>{resourceName}</Text>\n </Text>\n )}\n\n {selectedProvider === 'ollama' && (\n <Text>\n <Text bold>Server URL: </Text>\n <Text color={theme.suggestion}>{ollamaBaseUrl}</Text>\n </Text>\n )}\n\n {selectedProvider === 'custom-openai' && (\n <Text>\n <Text bold>API Base URL: </Text>\n <Text color={theme.suggestion}>{customBaseUrl}</Text>\n </Text>\n )}\n\n <Text>\n <Text bold>Model: </Text>\n <Text color={theme.suggestion}>{selectedModel}</Text>\n </Text>\n\n {apiKey && showsApiKey && (\n <Text>\n <Text bold>API Key: </Text>\n <Text color={theme.suggestion}>****{apiKey.slice(-4)}</Text>\n </Text>\n )}\n\n {maxTokens && (\n <Text>\n <Text bold>Max Tokens: </Text>\n <Text color={theme.suggestion}>{maxTokens}</Text>\n </Text>\n )}\n\n <Text>\n <Text bold>Context Length: </Text>\n <Text color={theme.suggestion}>\n {CONTEXT_LENGTH_OPTIONS.find(\n opt => opt.value === contextLength,\n )?.label || `${contextLength.toLocaleString()} tokens`}\n </Text>\n </Text>\n\n {supportsReasoningEffort && (\n <Text>\n <Text bold>Reasoning Effort: </Text>\n <Text color={theme.suggestion}>{reasoningEffort}</Text>\n </Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\n model parameters or <Text color={theme.suggestion}>Enter</Text>{' '}\n to save configuration\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // Render Anthropic Sub-Menu Selection Screen\n if (currentScreen === 'anthropicSubMenu') {\n const anthropicOptions = [\n { label: 'Official Anthropic API', value: 'official' },\n { label: 'BigDream (Community Proxy)', value: 'bigdream' },\n { label: 'OpenDev (Community Proxy)', value: 'opendev' },\n { label: 'Custom Anthropic-Compatible API', value: 'custom' },\n ]\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Box\n flexDirection=\"column\"\n gap={1}\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n Claude Provider Selection{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n Choose your Anthropic API access method for this model profile:\n </Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n \u2022 <Text bold>Official Anthropic API:</Text> Direct access to\n Anthropic's official API\n <Newline />\u2022 <Text bold>BigDream:</Text> Community proxy\n providing Claude access\n <Newline />\u2022 <Text bold>Custom:</Text> Your own\n Anthropic-compatible API endpoint\n </Text>\n </Box>\n\n <Select\n options={anthropicOptions}\n onChange={handleAnthropicProviderSelection}\n />\n\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color={theme.suggestion}>Esc</Text> to go back to\n provider selection\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n }\n\n // Render Provider Selection Screen\n return (\n <ScreenContainer \n title=\"Provider Selection\" \n exitState={exitState}\n children={\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n Select your preferred AI provider for this model profile:\n </Text>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n Choose the provider you want to use for this model profile.\n <Newline />\n This will determine which models are available to you.\n </Text>\n </Box>\n\n <Select options={providerOptions} onChange={handleProviderSelection} />\n\n <Box marginTop={1}>\n <Text dimColor>\n You can change this later by running{' '}\n <Text color={theme.suggestion}>/model</Text> again\n </Text>\n </Box>\n </Box>\n }\n />\n )\n}\n"],
5
- "mappings": "AAAA,OAAO,SAAS,UAAU,WAAwB,cAAc;AAChE,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAGhC,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ,SAAS;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,KAAK;AAAA,MACL,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,IAEV,oCAAC,QAAK,MAAI,QACP,OAAO,KACP,UAAU,UAAU,UAAU,UAAU,OAAO,oBAAoB,EACtE;AAAA,IACC;AAAA,EACH;AAEJ;AAEA,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EAIA;AAAA,EACA;AAAA,OACK;AACP,OAAO,UAAU,iBAAiB;AAClC,OAAO,eAAe;AACtB,OAAO,YAAY;AACnB,OAAO,WAAW;AAClB,SAA+B,oBAAoB;AACnD,SAAS,yBAA2C;AACpD,SAAS,oBAAoB,0BAA0B;AAyBvD,MAAM,yBAAgD;AAAA,EACpD,EAAE,OAAO,cAAc,OAAO,KAAM;AAAA,EACpC,EAAE,OAAO,cAAc,OAAO,KAAM;AAAA,EACpC,EAAE,OAAO,eAAe,OAAO,MAAO;AAAA,EACtC,EAAE,OAAO,eAAe,OAAO,IAAO;AAAA,EACtC,EAAE,OAAO,eAAe,OAAO,MAAO;AAAA,EACtC,EAAE,OAAO,eAAe,OAAO,IAAO;AAAA,EACtC,EAAE,OAAO,eAAe,OAAO,MAAO;AAAA,EACtC,EAAE,OAAO,gBAAgB,OAAO,IAAQ;AAAA,EACxC,EAAE,OAAO,gBAAgB,OAAO,IAAQ;AAAA,EACxC,EAAE,OAAO,gBAAgB,OAAO,IAAQ;AAAA,EACxC,EAAE,OAAO,gBAAgB,OAAO,IAAQ;AAAA,EACxC,EAAE,OAAO,iBAAiB,OAAO,IAAS;AAC5C;AAEA,MAAM,yBAAyB;AAQ/B,MAAM,qBAAwC;AAAA,EAC5C,EAAE,OAAO,aAAa,OAAO,KAAK;AAAA,EAClC,EAAE,OAAO,aAAa,OAAO,KAAK;AAAA,EAClC,EAAE,OAAO,aAAa,OAAO,KAAK;AAAA,EAClC,EAAE,OAAO,2BAA2B,OAAO,KAAK;AAAA,EAChD,EAAE,OAAO,cAAc,OAAO,MAAM;AAAA,EACpC,EAAE,OAAO,cAAc,OAAO,MAAM;AAAA,EACpC,EAAE,OAAO,cAAc,OAAO,MAAM;AAAA,EACpC,EAAE,OAAO,eAAe,OAAO,OAAO;AACxC;AAEA,MAAM,qBAAqB;AAG3B,SAAS,oBACP,UACA,iBACA;AAEA,QAAM,aAAa,OAAO,KAAK;AAE/B;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,IAAI,UAAU,CAAC,WAAW,SAAS;AACrC,mBAAW,UAAU;AAErB,mBAAW,MAAM;AACf,qBAAW,UAAU;AAAA,QACvB,GAAG,GAAG;AACN,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,EAAE,UAAU,KAAK;AAAA,EACnB;AACF;AAEA,SAAS,mBAAmB;AAC1B,QAAM,SAAS,gBAAgB;AAE/B,QAAM,gBAAgB,OAAO,iBAAiB,CAAC;AAC/C,QAAM,iBAAiB,cAAc,OAAO,OAAK,EAAE,QAAQ;AAE3D,MAAI,eAAe,WAAW,GAAG;AAC/B,YAAQ,IAAI,MAAM,KAAK,+CAA0C,CAAC;AAClE;AAAA,EACF;AAEA,QAAM,iBAAiB,eACpB,IAAI,OAAK,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,KAAK,EAAE,SAAS,GAAG,EACpD,KAAK,KAAK;AACb,UAAQ,IAAI,MAAM,KAAK,aAAQ,cAAc,EAAE,CAAC;AAClD;AAEO,SAAS,cAAc;AAAA,EAC5B,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,gBAAgB;AAClB,GAA2B;AACzB,QAAM,SAAS,gBAAgB;AAC/B,QAAM,QAAQ,SAAS;AACvB,QAAM,SAAS,MAAM;AACnB,qBAAiB;AACjB,eAAW;AAAA,EACb;AAEA,QAAM,YAAY,gBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC;AAGvD,QAAM,mBAAmB,MAAc;AACrC,WAAO;AAAA,EACT;AAGA,QAAM,CAAC,aAAa,cAAc,IAAI,SAcpC,CAAC,iBAAiB,CAAC,CAAC;AAGtB,QAAM,gBAAgB,YAAY,YAAY,SAAS,CAAC;AAGxD,QAAM,aAAa,CACjB,WAYG;AACH,mBAAe,UAAQ,CAAC,GAAG,MAAM,MAAM,CAAC;AAAA,EAC1C;AAGA,QAAM,SAAS,MAAM;AACnB,QAAI,YAAY,SAAS,GAAG;AAE1B,qBAAe,UAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,IAC1C,OAAO;AAEL,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,CAAC,kBAAkB,mBAAmB,IAAI;AAAA,IAC9C,OAAO,mBAAmB;AAAA,EAC5B;AAGA,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAExD,UAAU;AACZ,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAiB,EAAE;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAiB,EAAE;AAG/C,QAAM,CAAC,WAAW,YAAY,IAAI;AAAA,IAChC,OAAO,WAAW,SAAS,KAAK,mBAAmB,SAAS;AAAA,EAC9D;AACA,QAAM,CAAC,eAAe,gBAAgB,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,CAAC,yBAAyB,0BAA0B,IACxD,SAAiB,OAAO,aAAa,kBAAkB;AACzD,QAAM,CAAC,iBAAiB,kBAAkB,IACxC,SAAgC,QAAQ;AAC1C,QAAM,CAAC,yBAAyB,0BAA0B,IACxD,SAAkB,KAAK;AAGzB,QAAM,CAAC,eAAe,gBAAgB,IAAI;AAAA,IACxC;AAAA,EACF;AAGA,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,CAAC;AAC1D,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAiB,CAAC;AAK5E,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAsB,CAAC,CAAC;AACtE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAC5D,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAwB,IAAI;AACxE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAiB,EAAE;AACnE,QAAM,CAAC,yBAAyB,0BAA0B,IACxD,SAAiB,CAAC;AACpB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAiB,CAAC;AAC1D,QAAM,CAAC,cAAc,eAAe,IAAI,SAAkB,KAAK;AAG/D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiB,CAAC;AAChE,QAAM,CAAC,YAAY,aAAa,IAAI,SAAkB,KAAK;AAG3D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAkB,KAAK;AAC7E,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAK9C,IAAI;AAGd,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAwB,IAAI;AAG1E,QAAM,CAAC,cAAc,eAAe,IAAI,SAAiB,EAAE;AAC3D,QAAM,CAAC,0BAA0B,2BAA2B,IAC1D,SAAiB,CAAC;AACpB,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiB,EAAE;AACjE,QAAM,CAAC,6BAA6B,8BAA8B,IAChE,SAAiB,CAAC;AAGpB,QAAM,CAAC,eAAe,gBAAgB,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,CAAC,2BAA2B,4BAA4B,IAC5D,SAAiB,CAAC;AAGpB,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAiB,EAAE;AAC7D,QAAM,CAAC,2BAA2B,4BAA4B,IAC5D,SAAiB,CAAC;AAGpB,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiB,EAAE;AACjE,QAAM,CAAC,6BAA6B,8BAA8B,IAChE,SAAiB,CAAC;AAGpB,QAAM,yBAAyB;AAAA,IAC7B,EAAE,OAAO,mDAAmD,OAAO,MAAM;AAAA,IACzE,EAAE,OAAO,+CAA+C,OAAO,SAAS;AAAA,IACxE;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,qBAAqB,OAAO,KAAK,SAAS,EAAE;AAAA,IAChD,cAAY,aAAa,cAAc,aAAa;AAAA,EACtD;AAGA,QAAM,kBAAkB,mBAAmB,IAAI,cAAY;AACzD,UAAM,aAAa,OAAO,QAAQ,GAAG,UAAU;AAC/C,UAAM,QAAQ,iBAAiB,UAAU,UAAU;AACnD,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,QAAI,CAAC,gBAAgB,kBAAkB;AACrC,UAAI,QAAQ,IAAI,iBAAiB,YAAY,IAAI,UAAU,GAAG;AAC5D;AAAA,UACE,QAAQ,IAAI,iBAAiB,YAAY,IAAI,UAAU;AAAA,QACzD;AAAA,MACF,OAAO;AACL,kBAAU,EAAE;AAAA,MACd;AAAA,IACF;AAAA,EACF,GAAG,CAAC,kBAAkB,QAAQ,YAAY,CAAC;AAG3C,YAAU,MAAM;AACd,QACE,kBAAkB,mBAClB,CAAC,uBAAuB,KAAK,SAAO,IAAI,UAAU,aAAa,GAC/D;AACA,uBAAiB,sBAAsB;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,eAAe,aAAa,CAAC;AAGjC,QAAM,gBAAgB,IAAI;AAAA,KACvB,OAAO,gBAAuC,KAAK,CAAC,GAAG;AAAA,MACtD,CAAC,UAAe,MAAM;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,iBAAiB,mBACnB,gBAAgB;AAAA,IAAO,WACrB,MAAM,OAAO,YAAY,EAAE,SAAS,iBAAiB,YAAY,CAAC;AAAA,EACpE,IACA;AAGJ,QAAM,uBAAuB,CAACA,YAAwB;AACpD,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAOA,QAAO,KAAK,CAAC,GAAG,MAAM;AAE3B,YAAM,cAAc,EAAE,OAAO,YAAY,KAAK;AAC9C,YAAM,cAAc,EAAE,OAAO,YAAY,KAAK;AAG9C,YAAM,eAAe,iBAAiB;AAAA,QAAK,aACzC,YAAY,SAAS,OAAO;AAAA,MAC9B;AACA,YAAM,eAAe,iBAAiB;AAAA,QAAK,aACzC,YAAY,SAAS,OAAO;AAAA,MAC9B;AAGA,UAAI,gBAAgB,CAAC,aAAc,QAAO;AAC1C,UAAI,CAAC,gBAAgB,aAAc,QAAO;AAG1C,aAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAEA,QAAM,uBAAuB,qBAAqB,cAAc;AAEhE,QAAM,eAAe,qBAAqB,IAAI,WAAS;AAErD,UAAM,gBAAgB,cAAc,IAAI,MAAM,KAAK;AAEnD,WAAO;AAAA,MACL,OAAO,GAAG,MAAM,KAAK,GAAG,gBAAgB,KAAK,CAAC;AAAA,MAC9C,OAAO,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AAED,WAAS,gBAAgB,OAA0B;AACjD,UAAM,UAAU,CAAC;AAEjB,QAAI,MAAM,YAAY;AACpB,cAAQ,KAAK,GAAG,aAAa,MAAM,UAAU,CAAC,SAAS;AAAA,IACzD;AAEA,QAAI,MAAM,iBAAiB;AACzB,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAEA,QAAI,MAAM,2BAA2B;AACnC,cAAQ,KAAK,OAAO;AAAA,IACtB;AAEA,WAAO,QAAQ,SAAS,IAAI,KAAK,QAAQ,KAAK,IAAI,CAAC,MAAM;AAAA,EAC3D;AAEA,WAAS,aAAa,KAAqB;AACzC,QAAI,OAAO,KAAS;AAClB,aAAO,IAAI,MAAM,KAAS,QAAQ,CAAC,CAAC;AAAA,IACtC,WAAW,OAAO,KAAM;AACtB,aAAO,IAAI,MAAM,KAAM,QAAQ,CAAC,CAAC;AAAA,IACnC;AACA,WAAO,IAAI,SAAS;AAAA,EACtB;AAEA,WAAS,iBAAiB,UAAkB,YAA4B;AAEtE,QAAI,UAAU,QAAQ,GAAG;AACvB,aAAO,GAAG,UAAU,QAAQ,EAAE,IAAI,IAAI,UAAU,QAAQ,EAAE,WAAW,QAAQ,UAAU,EAAE,KAAK,UAAU;AAAA,IAC1G;AACA,WAAO,GAAG,QAAQ;AAAA,EACpB;AAEA,WAAS,wBAAwB,UAAkB;AACjD,UAAM,eAAe;AACrB,wBAAoB,YAAY;AAEhC,QAAI,aAAa,UAAU;AAEzB,wBAAkB,cAAc,iBAAiB,EAAE;AACnD,aAAO;AAAA,IACT,WAAW,aAAa,aAAa;AAEnC,iBAAW,kBAAkB;AAAA,IAC/B,OAAO;AAGL,YAAM,iBAAiB,UAAU,YAAY,GAAG,WAAW;AAC3D,yBAAmB,cAAc;AACjC,iBAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAGA,iBAAeC,sBAAqB,SAAiBC,SAAgB;AACnE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,cAAc;AAAA,QACnD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,aAAaA;AAAA,UACb,qBAAqB;AAAA,UACrB,gBAAgB;AAAA,UAChB,iBAAiB,UAAUA,OAAM;AAAA,QACnC;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF,WAAW,SAAS,WAAW,KAAK;AAClC,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACtE,WAAW,SAAS,WAAW,KAAK;AAClC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF,WAAW,SAAS,WAAW,KAAK;AAClC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF,WAAW,SAAS,UAAU,KAAK;AACjC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF,OAAO;AACL,gBAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,IAAI;AAAA,QAClE;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,SAAS,KAAK;AAGjC,UAAIF,UAAS,CAAC;AACd,UAAI,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,IAAI,GAAG;AACjD,QAAAA,UAAS,KAAK;AAAA,MAChB,WAAW,MAAM,QAAQ,IAAI,GAAG;AAC9B,QAAAA,UAAS;AAAA,MACX,WAAW,QAAQ,KAAK,UAAU,MAAM,QAAQ,KAAK,MAAM,GAAG;AAC5D,QAAAA,UAAS,KAAK;AAAA,MAChB,OAAO;AACL,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AAEA,aAAOA;AAAA,IACT,SAAS,OAAO;AACd,UACE,iBAAiB,UAChB,MAAM,QAAQ,SAAS,SAAS,KAC/B,MAAM,QAAQ,SAAS,cAAc,KACrC,MAAM,QAAQ,SAAS,aAAa,KACpC,MAAM,QAAQ,SAAS,iBAAiB,IAC1C;AACA,cAAM;AAAA,MACR;AAEA,UAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,OAAO,GAAG;AAC7D,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,iBAAe,2CACb,SACA,UACA,WACA;AACA,QAAI,YAA0B;AAG9B,QAAI;AACF,YAAMA,UAAS,MAAMC,sBAAqB,SAAS,MAAM;AACzD,aAAOD,QAAO,IAAI,CAAC,WAAgB;AAAA,QACjC,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE;AAAA,QACA,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB,MAAM,mBAAmB;AAAA,QAC1C,2BAA2B,MAAM,6BAA6B;AAAA,QAC9D,2BAA2B;AAAA,MAC7B,EAAE;AAAA,IACJ,SAAS,OAAO;AACd,kBAAY;AACZ,cAAQ;AAAA,QACN,4BAA4B,QAAQ;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAGA,QAAI;AACF,YAAMA,UAAS,MAAM,kBAAkB,SAAS,MAAM;AACtD,aAAOA,QAAO,IAAI,CAAC,WAAgB;AAAA,QACjC,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE;AAAA,QACA,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB,MAAM,mBAAmB;AAAA,QAC1C,2BAA2B,MAAM,6BAA6B;AAAA,QAC9D,2BAA2B;AAAA,MAC7B,EAAE;AAAA,IACJ,SAAS,OAAO;AACd,kBAAY;AACZ,cAAQ;AAAA,QACN,yBAAyB,QAAQ;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,eAAe,mBAAmB,QAAQ;AAE9C,QAAI,WAAW;AACb,qBAAe,UAAU;AAAA,IAC3B;AAGA,QAAI,aAAa,SAAS,SAAS,GAAG;AACpC,sBAAgB;AAAA;AAAA,uCAAqC,SAAS;AAAA,IAChE,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,sBAAgB;AAAA;AAAA,0DAAwD,QAAQ;AAAA,IAClF,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,sBAAgB;AAAA,IAClB;AAEA,sBAAkB,YAAY;AAC9B,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAGA,iBAAe,yCAAyC;AAEtD,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,YAAQ,uBAAuB;AAAA,MAC7B,KAAK;AACH,yBAAiB;AACjB,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACF,KAAK;AACH,yBAAiB;AACjB,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACF,KAAK;AACH,yBAAiB;AACjB,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACF,KAAK;AACH,yBAAiB;AACjB,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACF;AACE,cAAM,IAAI;AAAA,UACR,wCAAwC,qBAAqB;AAAA,QAC/D;AAAA,IACJ;AAEA,UAAM,UACJ,0BAA0B,WACtB,kBACA,mBAAmB;AACzB,WAAO,MAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAIA,iBAAe,kBAAkB;AAC/B,QAAI;AACF,YAAM,UAAU,mBAAmB;AACnC,YAAMA,UAAS,MAAM,kBAAkB,SAAS,MAAM;AAEtD,YAAM,aAAaA,QAAO,IAAI,CAAC,WAAgB;AAAA,QAC7C,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE,UAAU;AAAA,QACV,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB;AAAA;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,MAAM;AAAA,MACvB;AAGA,UAAI,aAAa,SAAS,SAAS,GAAG;AACpC,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ;AAEA,wBAAkB,YAAY;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,sBAAsB;AACnC,QAAI;AACF,YAAM,UAAU,mBAAmB;AACnC,YAAMA,UAAS,MAAM,kBAAkB,SAAS,MAAM;AAEtD,YAAM,iBAAiBA,QAAO,IAAI,CAAC,WAAgB;AAAA,QACjD,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE,UAAU;AAAA,QACV,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB;AAAA;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,MAAM;AAAA,MACvB;AAGA,UAAI,aAAa,SAAS,SAAS,GAAG;AACpC,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ;AAEA,wBAAkB,YAAY;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,yBAAyB;AACtC,QAAI;AACF,YAAM,UAAU,mBAAmB;AACnC,YAAMA,UAAS,MAAM,kBAAkB,SAAS,MAAM;AAEtD,YAAM,oBAAoBA,QAAO,IAAI,CAAC,WAAgB;AAAA,QACpD,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE,UAAU;AAAA,QACV,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB;AAAA;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,MAAM;AAAA,MACvB;AAGA,UAAI,aAAa,SAAS,SAAS,GAAG;AACpC,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ;AAEA,wBAAkB,YAAY;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,kBAAkB;AAC/B,QAAI;AACF,YAAM,UACJ,mBAAmB;AACrB,YAAMA,UAAS,MAAM,kBAAkB,SAAS,MAAM;AAEtD,YAAM,aAAaA,QAAO,IAAI,CAAC,WAAgB;AAAA,QAC7C,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE,UAAU;AAAA,QACV,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,MAAM;AAAA,MACvB;AAEA,UAAI,aAAa,SAAS,SAAS,GAAG;AACpC,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ;AAEA,wBAAkB,YAAY;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,iBAAiB;AAC9B,QAAI;AACF,YAAM,UAAU,mBAAmB;AACnC,YAAMA,UAAS,MAAM,kBAAkB,SAAS,MAAM;AAEtD,YAAM,YAAYA,QAAO,IAAI,CAAC,WAAgB;AAAA,QAC5C,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE,UAAU;AAAA,QACV,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,MAAM;AAAA,MACvB;AAEA,UAAI,aAAa,SAAS,SAAS,GAAG;AACpC,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ;AAEA,wBAAkB,YAAY;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,qBAAqB;AAClC,QAAI;AACF,YAAM,UAAU,mBAAmB;AACnC,YAAMA,UAAS,MAAM,kBAAkB,SAAS,MAAM;AAEtD,YAAM,gBAAgBA,QAAO,IAAI,CAAC,WAAgB;AAAA,QAChD,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE,UAAU;AAAA,QACV,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,MAAM;AAAA,MACvB;AAEA,UAAI,aAAa,SAAS,SAAS,GAAG;AACpC,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ;AAEA,wBAAkB,YAAY;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,0BAA0B;AACvC,QAAI;AACF,YAAM,UAAU,mBAAmB;AACnC,YAAMA,UAAS,MAAM,kBAAkB,SAAS,MAAM;AAEtD,YAAM,cAAcA,QAAO,IAAI,CAAC,WAAgB;AAAA,QAC9C,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE,UAAU;AAAA,QACV,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,MAAM;AAAA,MACvB;AAEA,UAAI,aAAa,SAAS,SAAS,GAAG;AACpC,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,YAAY,GAAG;AAC9C,wBACE;AAAA,MACJ;AAEA,wBAAkB,YAAY;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,0BAA0B;AACvC,QAAI;AACF,YAAMA,UAAS,MAAM,kBAAkB,eAAe,MAAM;AAE5D,YAAM,eAAeA,QAAO,IAAI,CAAC,WAAgB;AAAA,QAC/C,OAAO,MAAM,aAAa,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,QACnE,UAAU;AAAA,QACV,YAAY,MAAM,cAAc;AAAA,QAChC,iBAAiB;AAAA;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe;AAEnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,MAAM;AAAA,MACvB;AAGA,UAAI,aAAa,SAAS,SAAS,GAAG;AACpC,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,oBAAoB,GAAG;AACtD,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,SAAS,GAAG;AAC3C,wBACE;AAAA,MACJ,WAAW,aAAa,SAAS,iBAAiB,GAAG;AACnD,wBACE;AAAA,MACJ;AAEA,wBAAkB,YAAY;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,oBAAoB;AACjC,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,+DAA+D,MAAM;AAAA,MACvE;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAM,IAAI;AAAA,UACR,UAAU,OAAO,WAAW,cAAc,SAAS,MAAM;AAAA,QAC3D;AAAA,MACF;AAEA,YAAM,EAAE,QAAAA,QAAO,IAAI,MAAM,SAAS,KAAK;AAEvC,YAAM,eAAeA,QAClB;AAAA,QAAO,CAAC,UACP,MAAM,2BAA2B,SAAS,iBAAiB;AAAA,MAC7D,EACC,IAAI,CAAC,WAAgB;AAAA,QACpB,OAAO,MAAM,KAAK,QAAQ,WAAW,EAAE;AAAA,QACvC,UAAU;AAAA,QACV,YAAY,MAAM;AAAA,QAClB,iBACE,MAAM,2BAA2B,SAAS,iBAAiB;AAAA,QAC7D,2BACE,MAAM,2BAA2B,SAAS,iBAAiB;AAAA,MAC/D,EAAE;AAEJ,aAAO;AAAA,IACT,SAAS,OAAO;AACd;AAAA,QACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,oBAAoB;AACjC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,aAAa,SAAS;AAEtD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,cAAc,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,MACzE;AAEA,YAAM,eAAe,MAAM,SAAS,KAAK;AAIzC,UAAIA,UAAS,CAAC;AAGd,UAAI,aAAa,QAAQ,MAAM,QAAQ,aAAa,IAAI,GAAG;AACzD,QAAAA,UAAS,aAAa;AAAA,MACxB,WAES,MAAM,QAAQ,aAAa,MAAM,GAAG;AAC3C,QAAAA,UAAS,aAAa;AAAA,MACxB,WAES,MAAM,QAAQ,YAAY,GAAG;AACpC,QAAAA,UAAS;AAAA,MACX,OAAO;AACL,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAGA,YAAM,eAAeA,QAAO,IAAI,CAAC,WAAgB;AAAA,QAC/C,OACE,MAAM,QACN,MAAM,cACL,OAAO,UAAU,WAAW,QAAQ;AAAA,QACvC,UAAU;AAAA,QACV,YAAY;AAAA;AAAA,QACZ,iBAAiB;AAAA,QACjB,2BAA2B;AAAA,QAC3B,2BAA2B;AAAA,MAC7B,EAAE;AAGF,YAAM,cAAc,aAAa,OAAO,WAAS,MAAM,KAAK;AAE5D,yBAAmB,WAAW;AAG9B,UAAI,YAAY,SAAS,GAAG;AAC1B,mBAAW,OAAO;AAAA,MACpB,OAAO;AACL,0BAAkB,6CAA6C;AAAA,MACjE;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEvD,UAAI,aAAa,SAAS,OAAO,GAAG;AAClC;AAAA,UACE,yCAAyC,aAAa;AAAA,QACxD;AAAA,MACF,OAAO;AACL,0BAAkB,gCAAgC,YAAY,EAAE;AAAA,MAClE;AAEA,cAAQ,MAAM,iCAAiC,KAAK;AACpD,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,iBAAe,uBAAuB;AACpC,UAAM,cAAc;AACpB,QAAI,YAA0B;AAE9B,aAAS,UAAU,GAAG,WAAW,aAAa,WAAW;AACvD,yBAAmB,OAAO;AAC1B,oBAAc,UAAU,CAAC;AAEzB,UAAI,UAAU,GAAG;AAEf;AAAA,UACE,WAAW,OAAO,IAAI,WAAW;AAAA,QACnC;AAEA,cAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAI,CAAC;AAAA,MACxD;AAEA,UAAI;AACF,cAAMA,UAAS,MAAM,YAAY;AAEjC,2BAAmB,CAAC;AACpB,sBAAc,KAAK;AACnB,0BAAkB,IAAI;AACtB,eAAOA;AAAA,MACT,SAAS,OAAO;AACd,oBAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACpE,gBAAQ,IAAI,uBAAuB,OAAO,YAAY,UAAU,OAAO;AAEvE,YAAI,YAAY,aAAa;AAE3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,kBAAc,KAAK;AACnB,UAAM,eAAe,WAAW,WAAW;AAG3C,UAAM,sBAAsB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,gBAAgB;AAE3B,QAAI,qBAAqB;AACvB;AAAA,QACE,wCAAwC,WAAW,cAAc,YAAY;AAAA;AAAA;AAAA,MAC/E;AAGA,iBAAW,MAAM;AACf,0BAAkB,IAAI;AACtB,mBAAW,YAAY;AAAA,MACzB,GAAG,GAAI;AAAA,IACT,OAAO;AACL;AAAA,QACE,+BAA+B,WAAW,cAAc,YAAY;AAAA,MACtE;AAAA,IACF;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,iBAAe,cAAc;AAC3B,uBAAmB,IAAI;AACvB,sBAAkB,IAAI;AAEtB,QAAI;AAEF,UAAI,qBAAqB,aAAa;AACpC,cAAM,kBAAkB,MAAM,uCAAuC;AACrE,2BAAmB,eAAe;AAClC,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,iBAAiB;AACxC,cAAM,eAAe,MAAM,wBAAwB;AACnD,2BAAmB,YAAY;AAC/B,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,UAAU;AACjC,cAAM,eAAe,MAAM,kBAAkB;AAC7C,2BAAmB,YAAY;AAC/B,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,QAAQ;AAC/B,cAAM,aAAa,MAAM,gBAAgB;AACzC,2BAAmB,UAAU;AAC7B,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,YAAY;AACnC,cAAM,iBAAiB,MAAM,oBAAoB;AACjD,2BAAmB,cAAc;AACjC,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,eAAe;AACtC,cAAM,oBAAoB,MAAM,uBAAuB;AACvD,2BAAmB,iBAAiB;AACpC,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,QAAQ;AAC/B,cAAM,aAAa,MAAM,gBAAgB;AACzC,2BAAmB,UAAU;AAC7B,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,OAAO;AAC9B,cAAM,YAAY,MAAM,eAAe;AACvC,2BAAmB,SAAS;AAC5B,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,iBAAiB;AACxC,cAAM,cAAc,MAAM,wBAAwB;AAClD,2BAAmB,WAAW;AAC9B,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAGA,UAAI,qBAAqB,SAAS;AAChC,mBAAW,YAAY;AACvB,eAAO,CAAC;AAAA,MACV;AAGA,UAAI,UAAU,mBAAmB,UAAU,gBAAgB,GAAG;AAG9D,UAAI,qBAAqB,iBAAiB;AACxC,kBAAU;AAAA,MACZ;AAEA,YAAM,SAAS,IAAI,OAAO;AAAA,QACxB,QAAQ,UAAU;AAAA;AAAA,QAClB;AAAA,QACA,yBAAyB;AAAA,MAC3B,CAAC;AAGD,YAAM,WAAW,MAAM,OAAO,OAAO,KAAK;AAG1C,YAAM,gBAAgB,CAAC;AACvB,iBAAW,SAAS,SAAS,MAAM;AACjC,cAAM,YAAa,MAAc,aAAc,MAAc,MAAO,MAAc,QAAS,MAAc,SAAS;AAClH,cAAM,YAAY,OAAO,gBAAuC,GAAG;AAAA,UACjE,OAAK,EAAE,UAAU;AAAA,QACnB;AACA,sBAAc,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,UAAU;AAAA,UACV,YAAY,WAAW;AAAA,UACvB,iBAAiB,WAAW,mBAAmB;AAAA,UAC/C,2BACE,WAAW,6BAA6B;AAAA,UAC1C,2BACE,WAAW,6BAA6B;AAAA,QAC5C,CAAC;AAAA,MACH;AAEA,yBAAmB,aAAa;AAGhC,iBAAW,OAAO;AAElB,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,cAAQ,MAAM,0BAA0B,KAAK;AAG7C,YAAM;AAAA,IACR,UAAE;AACA,yBAAmB,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,WAAS,mBAAmB,KAAa;AACvC,cAAU,GAAG;AAGb,QAAI,qBAAqB,SAAS;AAChC,iBAAW,cAAc;AACzB;AAAA,IACF;AAGA,yBAAqB,EAAE,MAAM,WAAS;AAGpC,cAAQ,MAAM,8BAA8B,KAAK;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,WAAS,yBAAyB,MAAc;AAC9C,oBAAgB,IAAI;AACpB,eAAW,YAAY;AAAA,EACzB;AAEA,WAAS,0BAA0B,KAAa;AAC9C,qBAAiB,GAAG;AACpB,uBAAmB,IAAI;AACvB,sBAAkB,IAAI;AAGtB,sBAAkB,EAAE,QAAQ,MAAM;AAChC,yBAAmB,KAAK;AAAA,IAC1B,CAAC;AAAA,EACH;AAEA,WAAS,0BAA0B,KAAa;AAE9C,UAAM,WAAW,IAAI,QAAQ,QAAQ,EAAE;AACvC,qBAAiB,QAAQ;AAEzB,eAAW,QAAQ;AAAA,EACrB;AAEA,WAAS,4BAA4B,KAAa;AAEhD,UAAM,WAAW,IAAI,QAAQ,QAAQ,EAAE;AACvC,uBAAmB,QAAQ;AAG3B,QAAI,qBAAqB,UAAU;AACjC,uBAAiB,QAAQ;AACzB,yBAAmB,IAAI;AACvB,wBAAkB,IAAI;AAGtB,wBAAkB,EAAE,QAAQ,MAAM;AAChC,2BAAmB,KAAK;AAAA,MAC1B,CAAC;AAAA,IACH,OAAO;AAEL,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,iCACP,cACA;AACA,6BAAyB,YAAY;AAErC,QAAI,iBAAiB,UAAU;AAE7B,yBAAmB,EAAE;AACrB,iBAAW,SAAS;AAAA,IACtB,OAAO;AAEL,YAAM,cAAc;AAAA,QAClB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AACA,yBAAmB,YAAY,YAAY,CAAC;AAC5C,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,wBAAwB,OAAe;AAC9C,uBAAmB,KAAK;AACxB,qBAAiB,KAAK;AAGtB,+BAA2B,KAAK;AAChC,uBAAmB,IAAI;AAGvB,qBAAiB,QAAQ;AACzB,+BAA2B,kBAAkB;AAC7C,iBAAa,mBAAmB,SAAS,CAAC;AAC1C,6BAAyB,mBAAmB,SAAS,EAAE,MAAM;AAG7D,eAAW,aAAa;AAExB,wBAAoB,CAAC;AAAA,EACvB;AAEA,WAAS,qBAAqB,OAAe;AAC3C,qBAAiB,KAAK;AAGtB,UAAM,YAAY,gBAAgB,KAAK,OAAK,EAAE,UAAU,KAAK;AAC7D,+BAA2B,WAAW,6BAA6B,KAAK;AAExE,QAAI,CAAC,WAAW,2BAA2B;AACzC,yBAAmB,IAAI;AAAA,IACzB;AAGA,QAAI,WAAW,YAAY;AACzB,YAAM,iBAAiB,UAAU;AAEjC,YAAM,iBAAiB,mBAAmB;AAAA,QACxC,YAAU,OAAO,UAAU;AAAA,MAC7B;AAEA,UAAI,gBAAgB;AAClB,yBAAiB,QAAQ;AACzB,mCAA2B,cAAc;AACzC,qBAAa,eAAe,SAAS,CAAC;AAAA,MACxC,OAAO;AACL,yBAAiB,QAAQ;AACzB,qBAAa,eAAe,SAAS,CAAC;AAAA,MACxC;AACA,+BAAyB,eAAe,SAAS,EAAE,MAAM;AAAA,IAC3D,OAAO;AAEL,uBAAiB,QAAQ;AACzB,iCAA2B,kBAAkB;AAC7C,mBAAa,mBAAmB,SAAS,CAAC;AAC1C,+BAAyB,mBAAmB,SAAS,EAAE,MAAM;AAAA,IAC/D;AAGA,eAAW,aAAa;AAExB,wBAAoB,CAAC;AAAA,EACvB;AAEA,QAAM,0BAA0B,MAAM;AAGpC,QAAI,CAAC,uBAAuB,KAAK,SAAO,IAAI,UAAU,aAAa,GAAG;AACpE,uBAAiB,sBAAsB;AAAA,IACzC;AAEA,eAAW,eAAe;AAAA,EAC5B;AAEA,iBAAe,iBAKZ;AACD,2BAAuB,IAAI;AAC3B,4BAAwB,IAAI;AAE5B,QAAI;AAEF,UAAI,cACF,mBAAmB,UAAU,gBAAgB,GAAG,WAAW;AAE7D,UAAI,qBAAqB,SAAS;AAChC,sBAAc,WAAW,YAAY,wCAAwC,aAAa;AAAA,MAC5F,WAAW,qBAAqB,iBAAiB;AAC/C,sBAAc;AAAA,MAChB;AAGA,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,SAAS,gBAAgB;AAE3B,UAAI,oBAAoB;AAEtB,cAAM,SAAS,eAAe,YAAY,EAAE,SAAS,OAAO;AAE5D,YAAI,QAAQ;AACV,kBAAQ,IAAI,gEAAyD,aAAa,EAAE;AAGpF,gBAAM,mBAAmB,mBAAmB;AAAA,YAC1C,OAAO;AAAA,YACP;AAAA,YACA,SAAS;AAAA,YACT,WAAW,SAAS,SAAS,KAAK;AAAA,YAClC,UAAU;AAAA,UACZ,CAAC;AAED,cAAI,CAAC,iBAAiB,OAAO;AAC3B,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,SAAS;AAAA,cACT,SAAS,iBAAiB,OAAO,KAAK,IAAI;AAAA,YAC5C;AAAA,UACF;AAGA,gBAAM,aAAa,MAAM,mBAAmB;AAAA,YAC1C,OAAO;AAAA,YACP;AAAA,YACA,SAAS;AAAA,YACT,WAAW,SAAS,SAAS,KAAK;AAAA,YAClC,UAAU;AAAA,UACZ,CAAC;AAED,iBAAO;AAAA,QACT;AAGA,cAAM,iBAAiB,CAAC;AAExB,YAAI,qBAAqB,WAAW;AAClC,yBAAe;AAAA,YACb;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,YACA,EAAE,MAAM,qBAAqB,MAAM,kBAAkB;AAAA,UACvD;AAAA,QACF,OAAO;AACL,yBAAe,KAAK;AAAA,YAClB,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAEA,YAAI,YAAY;AAChB,mBAAW,YAAY,gBAAgB;AACrC,cAAI;AACF,kBAAM,aAAa,MAAM;AAAA,cACvB;AAAA,cACA,SAAS;AAAA,cACT,SAAS;AAAA,YACX;AAEA,gBAAI,WAAW,SAAS;AACtB,qBAAO;AAAA,YACT;AACA,wBAAY;AAAA,UACd,SAAS,OAAO;AACd,wBAAY;AAAA,cACV,SAAS;AAAA,cACT,SAAS,kBAAkB,SAAS,IAAI;AAAA,cACxC,UAAU,SAAS;AAAA,cACnB,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AAEA,eACE,aAAa;AAAA,UACX,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MAEJ,OAAO;AAEL,eAAO,MAAM,6BAA6B,WAAW;AAAA,MACvD;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAChE;AAAA,IACF,UAAE;AACA,6BAAuB,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,iBAAe,iBACb,SACA,cACA,cAMC;AACD,UAAM,UAAU,GAAG,QAAQ,QAAQ,QAAQ,EAAE,CAAC,GAAG,YAAY;AAG7D,UAAM,cAAmB;AAAA,MACvB,OAAO;AAAA,MACP,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,YAAY,KAAK,IAAI,SAAS,SAAS,KAAK,MAAM,IAAI;AAAA;AAAA,MACtD,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAGA,QAAI,iBAAiB,cAAc,YAAY,EAAE,SAAS,OAAO,GAAG;AAClE,cAAQ,IAAI,2CAA2C,aAAa,EAAE;AAGtE,UAAI,YAAY,YAAY;AAC1B,oBAAY,wBAAwB,YAAY;AAChD,eAAO,YAAY;AACnB,gBAAQ,IAAI,wDAAmD,YAAY,qBAAqB,EAAE;AAAA,MACpG;AAGA,UAAI,YAAY,gBAAgB,UAAa,YAAY,gBAAgB,GAAG;AAC1E,gBAAQ,IAAI,8BAA8B,YAAY,WAAW,iBAAiB;AAClF,oBAAY,cAAc;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAGA,QAAI,qBAAqB,SAAS;AAChC,cAAQ,SAAS,IAAI;AAAA,IACvB,OAAO;AACL,cAAQ,eAAe,IAAI,UAAU,MAAM;AAAA,IAC7C;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,SAAS;AAAA,QACpC,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,WAAW;AAAA,MAClC,CAAC;AAED,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAQ;AAAA,UACN;AAAA,UACA,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,QAC9B;AAGA,YAAI,kBAAkB;AAEtB,YAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,4BAAkB,KAAK,QAAQ,CAAC,GAAG,SAAS,WAAW;AAAA,QACzD,WAAW,KAAK,OAAO;AAErB,4BAAkB,KAAK;AAAA,QACzB,WAAW,KAAK,QAAQ;AAEtB,4BAAkB,KAAK,QAAQ,QAAQ,KAAK,UAAU;AAAA,QACxD;AAEA,gBAAQ,IAAI,uCAAuC,eAAe;AAGlE,cAAM,cAAc,gBAAgB,YAAY,EAAE,SAAS,KAAK;AAEhE,YAAI,aAAa;AACf,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,sCAAiC,YAAY;AAAA,YACtD,UAAU;AAAA,YACV,SAAS,+BAA+B,gBAAgB,KAAK,CAAC;AAAA,UAChE;AAAA,QACF,OAAO;AACL,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,gBAAM,YAAY;AAAA,YAC3B,UAAU;AAAA,YACV,SAAS,4BAA4B,gBAAgB,KAAK,KAAK,kBAAkB;AAAA,UACnF;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACxD,cAAM,eACJ,WAAW,OAAO,WAAW,WAAW,WAAW,SAAS;AAE9D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,UAAK,YAAY,YAAY,SAAS,MAAM;AAAA,UACrD,UAAU;AAAA,UACV,SAAS,UAAU,YAAY;AAAA,QACjC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,UAAK,YAAY;AAAA,QAC1B,UAAU;AAAA,QACV,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,sBACb,SACA,cACA,cAMC;AACD,UAAM,UAAU,GAAG,QAAQ,QAAQ,QAAQ,EAAE,CAAC,GAAG,YAAY;AAG7D,UAAM,cAAmB;AAAA,MACvB,OAAO;AAAA,MACP,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,uBAAuB,KAAK,IAAI,SAAS,SAAS,KAAK,MAAM,IAAI;AAAA,MACjE,aAAa;AAAA;AAAA;AAAA,MAEb,WAAW;AAAA,QACT,QAAQ;AAAA;AAAA,MACV;AAAA,IACF;AAEA,YAAQ,IAAI,oDAA6C,aAAa,EAAE;AACxE,YAAQ,IAAI,uBAAgB,OAAO,EAAE;AACrC,YAAQ,IAAI,2BAAoB,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAEpE,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,iBAAiB,UAAU,MAAM;AAAA,IACnC;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,SAAS;AAAA,QACpC,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,WAAW;AAAA,MAClC,CAAC;AAED,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAQ;AAAA,UACN;AAAA,UACA,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,QAC9B;AAGA,YAAI,kBAAkB;AAEtB,YAAI,KAAK,aAAa;AACpB,4BAAkB,KAAK;AAAA,QACzB,WAAW,KAAK,QAAQ;AACtB,4BAAkB,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,KAAK,OAAO,QAAQ;AAAA,QACxF;AAEA,gBAAQ,IAAI,uCAAuC,eAAe;AAGlE,cAAM,cAAc,gBAAgB,YAAY,EAAE,SAAS,KAAK;AAEhE,YAAI,aAAa;AACf,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,sCAAiC,YAAY;AAAA,YACtD,UAAU;AAAA,YACV,SAAS,iDAAiD,gBAAgB,KAAK,CAAC;AAAA,UAClF;AAAA,QACF,OAAO;AACL,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,gBAAM,YAAY;AAAA,YAC3B,UAAU;AAAA,YACV,SAAS,4BAA4B,gBAAgB,KAAK,KAAK,kBAAkB;AAAA,UACnF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACxD,cAAM,eACJ,WAAW,OAAO,WAAW,WAAW,WAAW,SAAS;AAE9D,gBAAQ,IAAI,wCAAiC,SAAS,MAAM,MAAM,SAAS;AAG3E,YAAI,UAAU,wBAAwB,YAAY;AAClD,YAAI,SAAS,WAAW,OAAO,aAAa,SAAS,YAAY,GAAG;AAClE,qBAAW;AAAA,QACb,WAAW,SAAS,WAAW,KAAK;AAClC,qBAAW;AAAA,QACb,WAAW,SAAS,WAAW,KAAK;AAClC,qBAAW;AAAA,QACb;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,UAAK,YAAY,YAAY,SAAS,MAAM;AAAA,UACrD,UAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,UAAK,YAAY;AAAA,QAC1B,UAAU;AAAA,QACV,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,6BAA6B,SAKzC;AAED,QAAI,qBAAqB,eAAe,qBAAqB,YAAY;AACvE,UAAI;AACF,gBAAQ;AAAA,UACN,mBAAmB,gBAAgB;AAAA,QACrC;AAGA,YAAI,cAAkC;AACtC,YAAI,qBAAqB,YAAY;AACnC,wBAAc,WAAW;AAAA,QAC3B,WAAW,qBAAqB,aAAa;AAE3C,wBACE,WAAW,YAAY,8BACnB,UACA;AAAA,QACR;AAGA,cAAM,UAAU,MAAM,aAAa,QAAQ,aAAa,gBAAgB;AAExE,YAAI,SAAS;AACX,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,UAAK,gBAAgB;AAAA,YAC9B,UAAU;AAAA,YACV,SAAS;AAAA,UACX;AAAA,QACF,OAAO;AACL,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,UAAK,gBAAgB;AAAA,YAC9B,UAAU;AAAA,YACV,SACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,IAAI,WAAW,gBAAgB,2BAA2B,KAAK;AACvE,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,UAAK,gBAAgB;AAAA,UAC9B,UAAU;AAAA,UACV,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAGA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,kCAA6B,gBAAgB;AAAA,MACtD,SAAS;AAAA,IACX;AAAA,EACF;AAEA,iBAAe,uBAAuB;AACpC,UAAM,SAAS,MAAM,eAAe;AACpC,4BAAwB,MAAM;AAE9B,QAAI,OAAO,SAAS;AAElB,iBAAW,MAAM;AACf,mBAAW,cAAc;AAAA,MAC3B,GAAG,GAAI;AAAA,IACT;AAAA,EACF;AAEA,QAAM,4BAA4B,MAAM;AAGtC,eAAW,gBAAgB;AAAA,EAC7B;AAEA,iBAAe,kBACb,UACA,OACwB;AACxB,QAAI,UAAU,mBAAmB,UAAU,QAAQ,GAAG,WAAW;AACjE,QAAI,iBAAiB;AAGrB,QAAI,aAAa,aAAa;AAC5B,cAAQ,uBAAuB;AAAA,QAC7B,KAAK;AACH,2BAAiB;AACjB,oBAAU,WAAW;AACrB;AAAA,QACF,KAAK;AACH,2BAAiB;AACjB,oBAAU,WAAW;AACrB;AAAA,QACF,KAAK;AACH,2BAAiB;AAEjB;AAAA,MACJ;AAAA,IACF;AAGA,QAAI,aAAa,SAAS;AACxB,gBAAU,WAAW,YAAY,wCAAwC,KAAK;AAAA,IAChF,WAES,aAAa,iBAAiB;AACrC,gBAAU;AAAA,IACZ;AAEA,QAAI;AAEF,YAAM,eAAe,gBAAgB;AAErC,YAAM,cAAc;AAAA,QAClB,MAAM,GAAG,cAAc,IAAI,KAAK;AAAA,QAChC,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,WAAW,SAAS,SAAS,KAAK;AAAA,QAClC,eAAe,iBAAiB;AAAA,QAChC;AAAA,MACF;AAGA,aAAO,MAAM,aAAa,SAAS,WAAW;AAAA,IAChD,SAAS,OAAO;AAEd;AAAA,QACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,iBAAe,qBAAqB;AAElC,uBAAmB,IAAI;AAGvB,UAAM,UAAU,MAAM,kBAAkB,kBAAkB,aAAa;AAGvE,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAGA,QAAI,YAAY,gBAAgB,gBAAgB;AAC9C,UAAI,cAAc;AAEhB,8BAAsB,OAAO;AAAA,MAC/B,WAAW,eAAe;AAExB,wBAAgB,eAAe,OAAO;AAAA,MACxC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,MAAM;AACvB,QAAI,kBAAkB,YAAY;AAEhC,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AAEL,qBAAe,UAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,IAC1C;AAAA,EACF;AAGA,sBAAoB,YAAY,eAAe;AAG/C,WAAS,yBAAyB,QAAgB;AAChD,oBAAgB,MAAM;AAAA,EACxB;AAGA,WAAS,mBAAmB,OAAe;AACzC,oBAAgB,IAAI;AACpB,cAAU,KAAK;AAAA,EACjB;AAGA,WAAS,wBAAwB,OAAe;AAC9C,wBAAoB,KAAK;AAEzB,+BAA2B,MAAM,MAAM;AAAA,EACzC;AAGA,WAAS,oCAAoC,QAAgB;AAC3D,+BAA2B,MAAM;AAAA,EACnC;AAGA,WAAS,CAAC,OAAO,QAAQ;AAEvB,QAAI,kBAAkB,YAAY,IAAI,QAAQ;AAC5C,UAAI,QAAQ;AACV,2BAAmB,MAAM;AAAA,MAC3B;AACA;AAAA,IACF;AAEA,QAAI,kBAAkB,YAAY,IAAI,KAAK;AAEzC,UACE,qBAAqB,eACrB,qBAAqB,UACrB,qBAAqB,cACrB,qBAAqB,UACrB,qBAAqB,SACrB,qBAAqB,aACrB,qBAAqB,mBACrB,qBAAqB,iBACrB,qBAAqB,iBACrB;AACA,mBAAW,YAAY;AACvB;AAAA,MACF;AAGA,2BAAqB,EAAE,MAAM,WAAS;AAGpC,gBAAQ,MAAM,8BAA8B,KAAK;AAAA,MACnD,CAAC;AACD;AAAA,IACF;AAGA,QAAI,kBAAkB,kBAAkB,IAAI,QAAQ;AAClD,UAAI,cAAc;AAChB,iCAAyB,YAAY;AAAA,MACvC;AACA;AAAA,IACF;AAGA,QAAI,kBAAkB,aAAa,IAAI,QAAQ;AAC7C,UAAI,qBAAqB,iBAAiB;AACxC,kCAA0B,aAAa;AAAA,MACzC,OAAO;AAEL,oCAA4B,eAAe;AAAA,MAC7C;AACA;AAAA,IACF;AAGA,QAAI,kBAAkB,gBAAgB,IAAI,QAAQ;AAChD,UAAI,iBAAiB;AACnB,gCAAwB,eAAe;AAAA,MACzC;AACA;AAAA,IACF;AAGA,QAAI,kBAAkB,kBAAkB,IAAI,QAAQ;AAClD,yBAAmB,EAAE,MAAM,WAAS;AAClC,gBAAQ,MAAM,gCAAgC,KAAK;AACnD;AAAA,UACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAC3C;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAGA,QAAI,kBAAkB,kBAAkB;AACtC,UAAI,IAAI,QAAQ;AACd,YAAI,CAAC,uBAAuB,CAAC,sBAAsB;AACjD,+BAAqB;AAAA,QACvB,WAAW,wBAAwB,qBAAqB,SAAS;AAC/D,qBAAW,cAAc;AAAA,QAC3B,WAAW,wBAAwB,CAAC,qBAAqB,SAAS;AAEhE,+BAAqB;AAAA,QACvB;AACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,kBAAkB,iBAAiB;AACrC,UAAI,IAAI,QAAQ;AACd,kCAA0B;AAC1B;AAAA,MACF;AAEA,UAAI,IAAI,SAAS;AACf,cAAM,eAAe,uBAAuB;AAAA,UAC1C,SAAO,IAAI,UAAU;AAAA,QACvB;AACA,cAAM,WACJ,eAAe,IACX,eAAe,IACf,iBAAiB,KACf,uBAAuB;AAAA,UACrB,SAAO,IAAI,UAAU;AAAA,QACvB,KAAK,IACL,uBAAuB,SAAS;AACxC,yBAAiB,uBAAuB,QAAQ,EAAE,KAAK;AACvD;AAAA,MACF;AAEA,UAAI,IAAI,WAAW;AACjB,cAAM,eAAe,uBAAuB;AAAA,UAC1C,SAAO,IAAI,UAAU;AAAA,QACvB;AACA,cAAM,WACJ,iBAAiB,KACb,uBAAuB;AAAA,UACrB,SAAO,IAAI,UAAU;AAAA,QACvB,KAAK,KACJ,eAAe,KAAK,uBAAuB;AAClD,yBAAiB,uBAAuB,QAAQ,EAAE,KAAK;AACvD;AAAA,MACF;AAAA,IACF;AAGA,QACE,kBAAkB,aAChB,IAAI,QAAQ,UAAU,OAAS,IAAI,QAAQ,UAAU,MACvD;AAEA;AAAA,QACE;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,kBAAkB,iBAAiB,IAAI,KAAK;AAC9C,YAAM,aAAa,4BAA4B;AAE/C,0BAAoB,cAAY,UAAU,KAAK,WAAW,MAAM;AAChE;AAAA,IACF;AAGA,QAAI,kBAAkB,iBAAiB,IAAI,QAAQ;AACjD,YAAM,aAAa,4BAA4B;AAC/C,YAAM,eAAe,WAAW,gBAAgB;AAEhD,UACE,aAAa,SAAS,YACtB,qBAAqB,WAAW,SAAS,GACzC;AAEA,gCAAwB;AAAA,MAC1B,WAAW,aAAa,cAAc,UAAU;AAE9C;AAAA,UAAoB,aAClB,KAAK,IAAI,UAAU,GAAG,WAAW,SAAS,CAAC;AAAA,QAC7C;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF,CAAC;AAGD,WAAS,8BAA8B;AACrC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,OAAO,SAAS,SAAS;AAAA,QACzB,WAAW;AAAA,QACX,SAAS,mBAAmB,IAAI,aAAW;AAAA,UACzC,OAAO,OAAO;AAAA,UACd,OAAO,OAAO,MAAM,SAAS;AAAA,QAC/B,EAAE;AAAA,QACF,cAAc;AAAA,MAChB;AAAA,MACA,GAAI,0BACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW;AAAA,QACb;AAAA,MACF,IACA,CAAC;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAGA,MAAI,kBAAkB,UAAU;AAC9B,UAAM,gBAAgB;AAEtB,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QAAC,iBACK,KACb,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,eACG,iBAAiB,kBAAkB,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,GAAG,KAAI,gBACzD,eAAc,GAC7B,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,0DACuB,KACtD,kBAAiB,SAClB,oCAAC,aAAQ,GAAE,0CAEX,oCAAC,aAAQ,GACT,oCAAC,aAAQ,GACR,qBAAqB,UACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAAY,+CAE/B,CACF,GAED,qBAAqB,cACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAAY,wCAE/B,CACF,GAED,qBAAqB,iBACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAAY,yCAE/B,CACF,GAED,qBAAqB,UACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAAY,wDAE/B,CACF,GAED,qBAAqB,SACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAAY,6CAE/B,CACF,GAED,qBAAqB,aACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAAY,+DAE/B,CACF,GAED,qBAAqB,mBACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAAY,oDAE/B,CACF,GAED,qBAAqB,eACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAChB,0BAA0B,aACvB,gDACA,0BAA0B,aACxB,2CACA,0BAA0B,YACxB,wDACA,0BACV,CACF,GAED,qBAAqB,YACpB,0DAAE,oCAC0B,KAC1B,oCAAC,QAAK,OAAO,MAAM,cAAY,sCAE/B,CACF,CAEJ,CACF,GAEA,oCAAC,WACC;AAAA,QAAC;AAAA;AAAA,UACC,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAS;AAAA,UACT;AAAA,UACA,sBAAsB;AAAA,UACtB,YAAY;AAAA;AAAA,MACd,CACF,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,YACC,oCAAC,QAAK,OAAO,MAAM,YAAY,UAAU,CAAC,UAAQ,kBAElD,GACA,oCAAC,YACE,KAAI,sDAEP,CACF,CACF,GAEC,mBACC,oCAAC,WACC,oCAAC,QAAK,OAAO,MAAM,cAAY,6BAE/B,CACF,GAED,kBACC,oCAAC,WACC,oCAAC,QAAK,OAAM,SAAM,WAAQ,cAAe,CAC3C,GAEF,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,OAAK,GAAO,iBAAc,KAC/D,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,OAAI,KAC5C,qBAAqB,eACtB,qBAAqB,UACrB,qBAAqB,cACrB,qBAAqB,UACrB,qBAAqB,SACrB,qBAAqB,aACrB,qBAAqB,mBACrB,qBAAqB,iBACrB,qBAAqB,kBACjB,+BACA,oBAAmB,SAClB,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,aAChD,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAGA,MAAI,kBAAkB,SAAS;AAC7B,UAAM,gBAAgB;AAEtB,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QAAC,mBACO,KACf,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,uBACW,KAElB;AAAA,QACE;AAAA,QACA,gBAAgB;AAAA,MAClB,EAAE,MAAM,IAAI,EAAE,CAAC,GACf,KAAI,QACD,eAAc,GACrB,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,gHAGlC,CACF,GAEA,oCAAC,OAAI,SAAS,KACZ,oCAAC,QAAK,MAAI,QAAC,gBAAc,GACzB;AAAA,QAAC;AAAA;AAAA,UACC,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS;AAAA,UACT,cAAc;AAAA,UACd,sBAAsB;AAAA,UACtB,YAAY;AAAA,UACZ,OAAO;AAAA;AAAA,MACT,CACF,GAEC,aAAa,SAAS,IACrB,0DACE;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU;AAAA;AAAA,MACZ,GACA,oCAAC,QAAK,UAAQ,QAAC,YACJ,aAAa,QAAO,QAAK,gBAAgB,QAAQ,KAAI,QAEhE,CACF,IAEA,oCAAC,WACE,gBAAgB,SAAS,IACxB,oCAAC,QAAK,OAAM,YAAS,qDAErB,IAEA,oCAAC,QAAK,OAAM,YAAS,wCAErB,CAEJ,GAGF,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,8BAEjD,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAEA,MAAI,kBAAkB,eAAe;AAEnC,UAAM,aAAa,4BAA4B;AAE/C,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QAAC,oBACQ,KAChB,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,6BAA0B,eAAc,GAAC,GACpD,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,QAC5B,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,sCACvB,KACtB,oCAAC,QAAK,OAAO,MAAM,cAAY,OAAK,GAAO,aAC7C,CACF,GAEA,oCAAC,OAAI,eAAc,YAChB,WAAW,IAAI,CAAC,OAAO,UACtB,oCAAC,OAAI,eAAc,UAAS,SAAS,GAAG,KAAK,MAAM,QAChD,MAAM,cAAc,WACnB,0DACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAI;AAAA,UACJ,OACE,qBAAqB,QAAQ,MAAM,UAAU;AAAA;AAAA,QAG9C,MAAM;AAAA,MACT,GACC,MAAM,eACL,oCAAC,QAAK,OAAO,MAAM,iBAChB,MAAM,WACT,CAEJ,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAI;AAAA,UACJ,OACE,qBAAqB,QAAQ,MAAM,UAAU;AAAA;AAAA,QAG9C,MAAM;AAAA,MACT,GAEF,oCAAC,OAAI,SAAS,KACX,qBAAqB,QACpB,MAAM,cAAc,WAClB,MAAM,SAAS,cACb;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,WAAW,CAAC;AAAA,UAC3B,UAAU,WAAS;AACjB,kBAAM,WAAW,SAAS,KAAK;AAC/B,yBAAa,SAAS,SAAS,CAAC;AAChC,uCAA2B,QAAQ;AACnC;AAAA,cACE,SAAS,SAAS,EAAE;AAAA,YACtB;AAEA,uBAAW,MAAM;AACf,kCAAoB,QAAQ,CAAC;AAAA,YAC/B,GAAG,GAAG;AAAA,UACR;AAAA,UACA,cAAc,MAAM;AAAA;AAAA,MACtB,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU,WAAS;AACjB,+BAAmB,KAA8B;AAEjD,uBAAW,MAAM;AACf,kCAAoB,QAAQ,CAAC;AAAA,YAC/B,GAAG,GAAG;AAAA,UACR;AAAA,UACA,cAAc;AAAA;AAAA,MAChB,IAEA,OACF,MAAM,SAAS,cACjB,oCAAC,QAAK,OAAO,MAAM,iBAAe,YACvB,KACT,oCAAC,QAAK,OAAO,MAAM,cAChB,mBAAmB;AAAA,QAClB,SAAO,IAAI,UAAU,SAAS,SAAS;AAAA,MACzC,GAAG,SAAS,GAAG,SAAS,SAC1B,CACF,IACE,MAAM,SAAS,oBACjB,oCAAC,QAAK,OAAO,MAAM,iBAAe,YACvB,KACT,oCAAC,QAAK,OAAO,MAAM,cAAa,eAAgB,CAClD,IACE,IACN,CACF,CACD,GAED,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,iBAAc,KAC7D,oCAAC,QAAK,OAAO,MAAM,cAAY,OAAK,GAAO,oBAAiB,KAC5D,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,aAC3C,CACF,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAGA,MAAI,kBAAkB,gBAAgB;AACpC,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QAAC,wBACY,KACpB,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,wCAAsC,GACjD,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,6EAGhC,oCAAC,aAAQ,GAAE,6FAGb,CACF,GAEA,oCAAC,WACC;AAAA,QAAC;AAAA;AAAA,UACC,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS;AAAA,UACT,cAAc;AAAA,UACd,sBAAsB;AAAA,UACtB,YAAY;AAAA;AAAA,MACd,CACF,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,YACC,oCAAC,QAAK,OAAO,MAAM,YAAY,UAAU,CAAC,gBAAc,wBAExD,GACA,oCAAC,YAAK,qCAAmC,CAC3C,CACF,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,OAAK,GAAO,mBAAgB,KACjE,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,aAC3C,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAGA,MAAI,kBAAkB,WAAW;AAC/B,UAAM,iBAAiB,qBAAqB;AAG5C,QAAI,gBAAgB;AAClB,aACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,QAAC;AAAA;AAAA,UACC,eAAc;AAAA,UACd,KAAK;AAAA,UACL,aAAY;AAAA,UACZ,aAAa,MAAM;AAAA,UACnB,UAAU;AAAA,UACV,UAAU;AAAA;AAAA,QAEV,oCAAC,QAAK,MAAI,QAAC,2BACe,KACvB,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,QACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,4BAA0B,GACrC,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,wDAEhC,oCAAC,aAAQ,GAAE,yCAEb,CACF,GAEA,oCAAC,WACC;AAAA,UAAC;AAAA;AAAA,YACC,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU;AAAA,YACV,UAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAc;AAAA,YACd,sBAAsB;AAAA,YACtB,YAAY,CAAC;AAAA,YACb,OAAO,CAAC;AAAA;AAAA,QACV,CACF,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,YACC;AAAA,UAAC;AAAA;AAAA,YACC,OACE,kBAAkB,MAAM,gBAAgB,MAAM;AAAA;AAAA,UAEjD;AAAA,QAED,GACA,oCAAC,YAAK,qCAAmC,CAC3C,CACF,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,OAAK,GAAO,oBAC9C,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,aAC9C,CACF,CACF;AAAA,MACF,CACF;AAAA,IAEJ;AAGA,UAAM,eAAe,UAAU,gBAAgB,GAAG,QAAQ;AAC1D,UAAM,aAAa,UAAU,gBAAgB,GAAG,WAAW;AAE3D,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QACP,cAAa,sBAAmB,KAChC,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,mCAAgC,cAAa,GAAC,GACzD,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAChB,qBAAqB,WACpB,0DAAE,0CAEA,oCAAC,aAAQ,GAAE,sEAGb,IAEA,0DAAE,iCAC8B,cAAa,SAC3C,oCAAC,aAAQ,GAAE,4DAEb,CAEJ,CACF,GAEA,oCAAC,WACC;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,UACb,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS;AAAA,UACT,cAAc;AAAA,UACd,sBAAsB;AAAA,UACtB,YAAY,CAAC;AAAA,UACb,OAAO,CAAC;AAAA;AAAA,MACV,CACF,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,YACC;AAAA,QAAC;AAAA;AAAA,UACC,OACE,kBAAkB,MAAM,gBAAgB,MAAM;AAAA;AAAA,QAEjD;AAAA,MAED,GACA,oCAAC,YAAK,qCAAmC,CAC3C,CACF,GAEC,mBACC,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,WAChB,qBAAqB,WAClB,mCACA,iBAAiB,YAAY,KACnC,CACF,GAGD,kBACC,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAM,SAAM,WAAQ,cAAe,CAC3C,GAGF,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,OAAK,GAAO,mBAAgB,KACjE,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,aAC3C,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAGA,MAAI,kBAAkB,cAAc;AAClC,UAAM,gBAAgB;AAGtB,QAAI,cAAc;AAClB,QAAI,cAAc;AAClB,QAAI,cAAc;AAClB,QAAI,WAAW;AAEf,QAAI,qBAAqB,SAAS;AAChC,oBAAc;AACd,oBAAc,+CAA+C,aAAa;AAC1E,iBAAW;AACX,oBAAc;AAAA,IAChB,WAAW,qBAAqB,aAAa;AAC3C,oBAAc;AACd,oBAAc,mCAAmC,aAAa;AAC9D,iBACE;AACF,oBAAc;AAAA,IAChB,WAAW,qBAAqB,YAAY;AAC1C,oBAAc;AACd,oBAAc,qCAAqC,aAAa;AAChE,iBACE;AACF,oBAAc;AAAA,IAChB,WAAW,qBAAqB,QAAQ;AACtC,oBAAc;AACd,oBAAc,iCAAiC,aAAa;AAC5D,iBAAW;AACX,oBAAc;AAAA,IAChB,WAAW,qBAAqB,YAAY;AAC1C,oBAAc;AACd,oBAAc,qCAAqC,aAAa;AAChE,iBACE;AACF,oBAAc;AAAA,IAChB,WAAW,qBAAqB,eAAe;AAC7C,oBAAc;AACd,oBAAc,wCAAwC,aAAa;AACnE,iBACE;AACF,oBAAc;AAAA,IAChB,WAAW,qBAAqB,QAAQ;AACtC,oBAAc;AACd,oBAAc,iCAAiC,aAAa;AAC5D,iBAAW;AACX,oBAAc;AAAA,IAChB,WAAW,qBAAqB,OAAO;AACrC,oBAAc;AACd,oBAAc,gCAAgC,aAAa;AAC3D,iBAAW;AACX,oBAAc;AAAA,IAChB,WAAW,qBAAqB,WAAW;AACzC,oBAAc;AACd,oBAAc,oCAAoC,aAAa;AAC/D,iBACE;AACF,oBAAc;AAAA,IAChB,WAAW,qBAAqB,iBAAiB;AAC/C,oBAAc;AACd,oBAAc,0CAA0C,aAAa;AACrE,iBACE;AACF,oBAAc;AAAA,IAChB,WAAW,qBAAqB,iBAAiB;AAC/C,oBAAc;AACd,oBAAc,4BAA4B,aAAa;AACvD,iBAAW;AACX,oBAAc;AAAA,IAChB;AAEA,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QACP,aAAa,KACb,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAE,WAAY,GACxB,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAChB,qBAAqB,UAClB,8EACA,qBAAqB,cACnB,gEACA,qBAAqB,aACnB,0EACA,qBAAqB,SACnB,mEACA,qBAAqB,aACnB,sDACA,qBAAqB,gBACnB,yDACA,qBAAqB,SACnB,qEACA,qBAAqB,QACnB,+DACA,qBAAqB,YACnB,qDACA,qBAAqB,kBACnB,2DACA,oEACtB,oCAAC,aAAQ,GACR,QACH,CACF,GAEA,oCAAC,WACC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS;AAAA,UACT,cAAc;AAAA,UACd,sBAAsB;AAAA,UACtB,YAAY;AAAA;AAAA,MACd,CACF,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,YACC,oCAAC,QAAK,OAAO,MAAM,YAAY,UAAU,CAAC,mBAAiB,qBAE3D,GACA,oCAAC,YAAK,qCAAmC,CAC3C,CACF,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,OAAK,GAAO,mBAAgB,KACjE,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,aAC3C,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAGA,MAAI,kBAAkB,iBAAiB;AACrC,UAAM,iBACJ,uBAAuB,KAAK,SAAO,IAAI,UAAU,aAAa,KAC9D,uBAAuB,CAAC;AAE1B,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QAAC,gCACoB,KAC5B,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,kDAAgD,GAC3D,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,+JAIlC,CACF,GAEA,oCAAC,OAAI,eAAc,UAAS,SAAS,KAClC,uBAAuB,IAAI,CAAC,QAAQ,UAAU;AAC7C,cAAM,aAAa,OAAO,UAAU;AACpC,eACE,oCAAC,OAAI,KAAK,OAAO,OAAO,eAAc,SACpC,oCAAC,QAAK,OAAO,aAAa,SAAS,UAChC,aAAa,YAAO,MACpB,OAAO,OACP,OAAO,UAAU,yBACd,mBACA,EACN,CACF;AAAA,MAEJ,CAAC,CACH,GAEA,oCAAC,OAAI,eAAc,UAAS,SAAS,KACnC,oCAAC,QAAK,UAAQ,QAAC,aACH,KACV,oCAAC,QAAK,OAAO,MAAM,cAAa,eAAe,KAAM,CACvD,CACF,CACF;AAAA,IACF,GAEA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,UAAQ,QAAC,oEAEf,CACF,CACF;AAAA,EAEJ;AAGA,MAAI,kBAAkB,kBAAkB;AACtC,UAAM,sBAAsB,iBAAiB,kBAAkB,CAAC,EAAE;AAAA,MAChE;AAAA,IACF,EAAE,CAAC;AAEH,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QAAC,mBACO,KACf,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,0BAAuB,qBAAoB,KAAG,GACzD,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,6EAG/B,qBAAqB,aACpB,0DACE,oCAAC,aAAQ,GAAE,wEAGb,CAEJ,CACF,GAEC,CAAC,wBAAwB,CAAC,uBACzB,oCAAC,OAAI,SAAS,KACZ,oCAAC,YACC,oCAAC,QAAK,OAAO,MAAM,cAAY,aAAW,GAAO,+BAEnD,CACF,GAGD,uBACC,oCAAC,OAAI,SAAS,KACZ,oCAAC,QAAK,OAAO,MAAM,cAAY,iCAAwB,CACzD,GAGD,wBACC,oCAAC,OAAI,eAAc,UAAS,SAAS,GAAG,UAAU,KAChD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,qBAAqB,UAAU,MAAM,UAAU;AAAA;AAAA,QAErD,qBAAqB;AAAA,MACxB,GAEC,qBAAqB,YACpB,oCAAC,QAAK,OAAO,MAAM,iBAAe,cACrB,qBAAqB,QAClC,GAGD,qBAAqB,WACpB,oCAAC,QAAK,OAAO,MAAM,iBAAe,aACtB,qBAAqB,OACjC,GAGD,qBAAqB,UACpB,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,WAAS,oDAE5B,CACF,IAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,YACC,oCAAC,QAAK,OAAO,MAAM,cAAY,aAAW,GAAO,uBACxC,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,aAEpD,CACF,CAEJ,GAGF,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,+BAEjD,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAGA,MAAI,kBAAkB,gBAAgB;AAIpC,UAAM,sBAAsB,iBAAiB,kBAAkB,CAAC,EAAE;AAAA,MAChE;AAAA,IACF,EAAE,CAAC;AAGH,UAAM,cAAc,qBAAqB;AAEzC,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QAAC,8BACkB,KAC1B,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,mCAAiC,GAC5C,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,8CAElC,CACF,GAEC,mBACC,oCAAC,OAAI,eAAc,UAAS,SAAS,GAAG,UAAU,KAChD,oCAAC,QAAK,OAAO,MAAM,OAAO,MAAI,QAAC,6BAE/B,GACA,oCAAC,QAAK,OAAO,MAAM,SAAQ,eAAgB,CAC7C,GAGF,oCAAC,OAAI,eAAc,UAAS,SAAS,GAAG,UAAU,KAChD,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,YAAU,GACrB,oCAAC,QAAK,OAAO,MAAM,cAAa,mBAAoB,CACtD,GAEC,qBAAqB,WACpB,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,iBAAe,GAC1B,oCAAC,QAAK,OAAO,MAAM,cAAa,YAAa,CAC/C,GAGD,qBAAqB,YACpB,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,cAAY,GACvB,oCAAC,QAAK,OAAO,MAAM,cAAa,aAAc,CAChD,GAGD,qBAAqB,mBACpB,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,gBAAc,GACzB,oCAAC,QAAK,OAAO,MAAM,cAAa,aAAc,CAChD,GAGF,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,SAAO,GAClB,oCAAC,QAAK,OAAO,MAAM,cAAa,aAAc,CAChD,GAEC,UAAU,eACT,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,WAAS,GACpB,oCAAC,QAAK,OAAO,MAAM,cAAY,QAAK,OAAO,MAAM,EAAE,CAAE,CACvD,GAGD,aACC,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,cAAY,GACvB,oCAAC,QAAK,OAAO,MAAM,cAAa,SAAU,CAC5C,GAGF,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,kBAAgB,GAC3B,oCAAC,QAAK,OAAO,MAAM,cAChB,uBAAuB;AAAA,QACtB,SAAO,IAAI,UAAU;AAAA,MACvB,GAAG,SAAS,GAAG,cAAc,eAAe,CAAC,SAC/C,CACF,GAEC,2BACC,oCAAC,YACC,oCAAC,QAAK,MAAI,QAAC,oBAAkB,GAC7B,oCAAC,QAAK,OAAO,MAAM,cAAa,eAAgB,CAClD,CAEJ,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,uCAC3B,oCAAC,QAAK,OAAO,MAAM,cAAY,OAAK,GAAQ,KAAI,uBAEtE,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAGA,MAAI,kBAAkB,oBAAoB;AACxC,UAAM,mBAAmB;AAAA,MACvB,EAAE,OAAO,0BAA0B,OAAO,WAAW;AAAA,MACrD,EAAE,OAAO,8BAA8B,OAAO,WAAW;AAAA,MACzD,EAAE,OAAO,6BAA6B,OAAO,UAAU;AAAA,MACvD,EAAE,OAAO,mCAAmC,OAAO,SAAS;AAAA,IAC9D;AAEA,WACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAEV,oCAAC,QAAK,MAAI,QAAC,6BACiB,KACzB,UAAU,UACP,UAAU,UAAU,OAAO,oBAC3B,EACN;AAAA,MACA,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,iEAEX,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,WAC9B,oCAAC,QAAK,MAAI,QAAC,yBAAuB,GAAO,8CAE3C,oCAAC,aAAQ,GAAE,WAAE,oCAAC,QAAK,MAAI,QAAC,WAAS,GAAO,4CAExC,oCAAC,aAAQ,GAAE,WAAE,oCAAC,QAAK,MAAI,QAAC,SAAO,GAAO,6CAExC,CACF,GAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU;AAAA;AAAA,MACZ,GAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,UACP,oCAAC,QAAK,OAAO,MAAM,cAAY,KAAG,GAAO,mCAEjD,CACF,CACF;AAAA,IACF,CACF;AAAA,EAEJ;AAGA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN;AAAA,MACA,UACE,oCAAC,OAAI,eAAc,UAAS,KAAK,KAC/B,oCAAC,QAAK,MAAI,QAAC,2DAEX,GACA,oCAAC,OAAI,eAAc,UAAS,OAAO,MACjC,oCAAC,QAAK,OAAO,MAAM,iBAAe,+DAEhC,oCAAC,aAAQ,GAAE,wDAEb,CACF,GAEA,oCAAC,UAAO,SAAS,iBAAiB,UAAU,yBAAyB,GAErE,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QAAC,wCACwB,KACrC,oCAAC,QAAK,OAAO,MAAM,cAAY,QAAM,GAAO,QAC9C,CACF,CACF;AAAA;AAAA,EAEJ;AAEJ;",
6
- "names": ["models", "fetchAnthropicModels", "apiKey"]
7
- }
@@ -1,87 +0,0 @@
1
- import React from "react";
2
- import { Text, Box } from "ink";
3
- import { getModelManager } from "../utils/model.js";
4
- import { getGlobalConfig } from "../utils/config.js";
5
- import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
6
- import { getTheme } from "../utils/theme.js";
7
- function ModelStatusDisplay({ onClose }) {
8
- const theme = getTheme();
9
- const exitState = useExitOnCtrlCD(onClose);
10
- try {
11
- const modelManager = getModelManager();
12
- const config = getGlobalConfig();
13
- const pointers = ["main", "task", "reasoning", "quick"];
14
- return /* @__PURE__ */ React.createElement(
15
- Box,
16
- {
17
- flexDirection: "column",
18
- borderStyle: "round",
19
- borderColor: theme.secondaryBorder,
20
- paddingX: 2,
21
- paddingY: 1
22
- },
23
- /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F4CA} Current Model Status", " ", exitState.pending ? `(press ${exitState.keyName} again to exit)` : ""),
24
- /* @__PURE__ */ React.createElement(Text, null, " "),
25
- pointers.map((pointer) => {
26
- try {
27
- const model = modelManager.getModel(pointer);
28
- if (model && model.name && model.provider) {
29
- return /* @__PURE__ */ React.createElement(Box, { key: pointer, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, "\u{1F3AF}", " ", /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.kode }, pointer.toUpperCase()), " ", "\u2192 ", model.name), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "Provider: ", model.provider), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "Model: ", model.modelName || "unknown"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "Context:", " ", model.contextLength ? Math.round(model.contextLength / 1e3) : "unknown", "k tokens"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "Active: ", model.isActive ? "\u2705" : "\u274C"));
30
- } else {
31
- return /* @__PURE__ */ React.createElement(Box, { key: pointer, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, "\u{1F3AF}", " ", /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.kode }, pointer.toUpperCase()), " ", "\u2192 ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u274C Not configured")));
32
- }
33
- } catch (pointerError) {
34
- return /* @__PURE__ */ React.createElement(Box, { key: pointer, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, "\u{1F3AF}", " ", /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.kode }, pointer.toUpperCase()), " ", "\u2192", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u274C Error: ", String(pointerError))));
35
- }
36
- }),
37
- /* @__PURE__ */ React.createElement(Text, null, " "),
38
- /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F4DA} Available Models:"),
39
- (() => {
40
- try {
41
- const availableModels = modelManager.getAvailableModels() || [];
42
- if (availableModels.length === 0) {
43
- return /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " No models configured");
44
- }
45
- return availableModels.map((model, index) => {
46
- try {
47
- const isInUse = pointers.some((p) => {
48
- try {
49
- return modelManager.getModel(p)?.modelName === model.modelName;
50
- } catch {
51
- return false;
52
- }
53
- });
54
- return /* @__PURE__ */ React.createElement(Box, { key: index, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, " ", isInUse ? "\u{1F504}" : "\u{1F4A4}", " ", model.name || "Unnamed", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "(", model.provider || "unknown", ")")), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "Model: ", model.modelName || "unknown"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "Context:", " ", model.contextLength ? Math.round(model.contextLength / 1e3) : "unknown", "k tokens"), model.lastUsed && /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "Last used: ", new Date(model.lastUsed).toLocaleString()));
55
- } catch (modelError) {
56
- return /* @__PURE__ */ React.createElement(Box, { key: index, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, " ", "\u274C Model error: ", String(modelError)));
57
- }
58
- });
59
- } catch (availableModelsError) {
60
- return /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u274C Error loading available models:", " ", String(availableModelsError));
61
- }
62
- })(),
63
- /* @__PURE__ */ React.createElement(Text, null, " "),
64
- /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F527} Debug Info:"),
65
- /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "ModelProfiles: ", config.modelProfiles?.length || 0, " configured"),
66
- /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "DefaultModelId: ", config.defaultModelId || "not set"),
67
- config.modelPointers && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", "ModelPointers configured:", " ", Object.keys(config.modelPointers).length > 0 ? "Yes" : "No"), Object.entries(config.modelPointers).map(([pointer, modelId]) => /* @__PURE__ */ React.createElement(React.Fragment, { key: pointer }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", pointer, ": ", modelId || "not set"))))
68
- );
69
- } catch (error) {
70
- return /* @__PURE__ */ React.createElement(
71
- Box,
72
- {
73
- flexDirection: "column",
74
- borderStyle: "round",
75
- borderColor: theme.error,
76
- paddingX: 2,
77
- paddingY: 1
78
- },
79
- /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F4CA} Model Status Error", " ", exitState.pending ? `(press ${exitState.keyName} again to exit)` : ""),
80
- /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u274C Error reading model status: ", String(error))
81
- );
82
- }
83
- }
84
- export {
85
- ModelStatusDisplay
86
- };
87
- //# sourceMappingURL=ModelStatusDisplay.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/components/ModelStatusDisplay.tsx"],
4
- "sourcesContent": ["import React from 'react'\nimport { Text, Box } from 'ink'\nimport { getModelManager } from '../utils/model'\nimport { getGlobalConfig } from '../utils/config'\nimport { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'\nimport { getTheme } from '../utils/theme'\n\ntype Props = {\n onClose: () => void\n}\n\nexport function ModelStatusDisplay({ onClose }: Props): React.ReactNode {\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n try {\n const modelManager = getModelManager()\n const config = getGlobalConfig()\n\n // \u663E\u793A\u6240\u6709\u6A21\u578B\u6307\u9488\u7684\u5F53\u524D\u72B6\u6001\n const pointers = ['main', 'task', 'reasoning', 'quick'] as const\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Current Model Status{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text> </Text>\n\n {pointers.map(pointer => {\n try {\n const model = modelManager.getModel(pointer)\n if (model && model.name && model.provider) {\n return (\n <Box key={pointer} flexDirection=\"column\" marginBottom={1}>\n <Text>\n \uD83C\uDFAF{' '}\n <Text bold color={theme.kode}>\n {pointer.toUpperCase()}\n </Text>{' '}\n \u2192 {model.name}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Provider: {model.provider}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Model: {model.modelName || 'unknown'}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Context:{' '}\n {model.contextLength\n ? Math.round(model.contextLength / 1000)\n : 'unknown'}\n k tokens\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Active: {model.isActive ? '\u2705' : '\u274C'}\n </Text>\n </Box>\n )\n } else {\n return (\n <Box key={pointer} flexDirection=\"column\" marginBottom={1}>\n <Text>\n \uD83C\uDFAF{' '}\n <Text bold color={theme.kode}>\n {pointer.toUpperCase()}\n </Text>{' '}\n \u2192 <Text color={theme.error}>\u274C Not configured</Text>\n </Text>\n </Box>\n )\n }\n } catch (pointerError) {\n return (\n <Box key={pointer} flexDirection=\"column\" marginBottom={1}>\n <Text>\n \uD83C\uDFAF{' '}\n <Text bold color={theme.kode}>\n {pointer.toUpperCase()}\n </Text>{' '}\n \u2192{' '}\n <Text color={theme.error}>\n \u274C Error: {String(pointerError)}\n </Text>\n </Text>\n </Box>\n )\n }\n })}\n\n <Text> </Text>\n <Text bold>\uD83D\uDCDA Available Models:</Text>\n\n {(() => {\n try {\n const availableModels = modelManager.getAvailableModels() || []\n\n if (availableModels.length === 0) {\n return (\n <Text color={theme.secondaryText}> No models configured</Text>\n )\n }\n\n return availableModels.map((model, index) => {\n try {\n const isInUse = pointers.some(p => {\n try {\n return (\n modelManager.getModel(p)?.modelName === model.modelName\n )\n } catch {\n return false\n }\n })\n\n return (\n <Box key={index} flexDirection=\"column\" marginBottom={1}>\n <Text>\n {' '}\n {isInUse ? '\uD83D\uDD04' : '\uD83D\uDCA4'} {model.name || 'Unnamed'}{' '}\n <Text color={theme.secondaryText}>\n ({model.provider || 'unknown'})\n </Text>\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Model: {model.modelName || 'unknown'}\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n Context:{' '}\n {model.contextLength\n ? Math.round(model.contextLength / 1000)\n : 'unknown'}\n k tokens\n </Text>\n {model.lastUsed && (\n <Text color={theme.secondaryText}>\n {' '}\n Last used: {new Date(model.lastUsed).toLocaleString()}\n </Text>\n )}\n </Box>\n )\n } catch (modelError) {\n return (\n <Box key={index} flexDirection=\"column\" marginBottom={1}>\n <Text color={theme.error}>\n {' '}\n \u274C Model error: {String(modelError)}\n </Text>\n </Box>\n )\n }\n })\n } catch (availableModelsError) {\n return (\n <Text color={theme.error}>\n \u274C Error loading available models:{' '}\n {String(availableModelsError)}\n </Text>\n )\n }\n })()}\n\n <Text> </Text>\n <Text bold>\uD83D\uDD27 Debug Info:</Text>\n <Text color={theme.secondaryText}>\n {' '}\n ModelProfiles: {config.modelProfiles?.length || 0} configured\n </Text>\n <Text color={theme.secondaryText}>\n {' '}\n DefaultModelId: {(config as any).defaultModelId || 'not set'}\n </Text>\n {config.modelPointers && (\n <>\n <Text color={theme.secondaryText}>\n {' '}\n ModelPointers configured:{' '}\n {Object.keys(config.modelPointers).length > 0 ? 'Yes' : 'No'}\n </Text>\n {Object.entries(config.modelPointers).map(([pointer, modelId]) => (\n <React.Fragment key={pointer}>\n <Text color={theme.secondaryText}>\n {' '}\n {pointer}: {modelId || 'not set'}\n </Text>\n </React.Fragment>\n ))}\n </>\n )}\n </Box>\n )\n } catch (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Model Status Error{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text color={theme.error}>\n \u274C Error reading model status: {String(error)}\n </Text>\n </Box>\n )\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }