snow-ai 0.4.15 → 0.4.17

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 (351) hide show
  1. package/bundle/cli.mjs +477445 -0
  2. package/bundle/sql-wasm.wasm +0 -0
  3. package/package.json +31 -26
  4. package/dist/agents/codebaseIndexAgent.d.ts +0 -102
  5. package/dist/agents/codebaseIndexAgent.js +0 -641
  6. package/dist/agents/codebaseReviewAgent.d.ts +0 -61
  7. package/dist/agents/codebaseReviewAgent.js +0 -301
  8. package/dist/agents/compactAgent.d.ts +0 -55
  9. package/dist/agents/compactAgent.js +0 -306
  10. package/dist/agents/promptOptimizeAgent.d.ts +0 -54
  11. package/dist/agents/promptOptimizeAgent.js +0 -268
  12. package/dist/agents/reviewAgent.d.ts +0 -50
  13. package/dist/agents/reviewAgent.js +0 -265
  14. package/dist/agents/summaryAgent.d.ts +0 -57
  15. package/dist/agents/summaryAgent.js +0 -260
  16. package/dist/api/anthropic.d.ts +0 -44
  17. package/dist/api/anthropic.js +0 -598
  18. package/dist/api/chat.d.ts +0 -73
  19. package/dist/api/chat.js +0 -386
  20. package/dist/api/embedding.d.ts +0 -34
  21. package/dist/api/embedding.js +0 -80
  22. package/dist/api/gemini.d.ts +0 -31
  23. package/dist/api/gemini.js +0 -445
  24. package/dist/api/models.d.ts +0 -15
  25. package/dist/api/models.js +0 -139
  26. package/dist/api/responses.d.ts +0 -38
  27. package/dist/api/responses.js +0 -515
  28. package/dist/api/systemPrompt.d.ts +0 -4
  29. package/dist/api/systemPrompt.js +0 -408
  30. package/dist/api/types.d.ts +0 -53
  31. package/dist/api/types.js +0 -4
  32. package/dist/app.d.ts +0 -8
  33. package/dist/app.js +0 -112
  34. package/dist/cli.d.ts +0 -2
  35. package/dist/cli.js +0 -199
  36. package/dist/hooks/useAgentPicker.d.ts +0 -14
  37. package/dist/hooks/useAgentPicker.js +0 -119
  38. package/dist/hooks/useClipboard.d.ts +0 -4
  39. package/dist/hooks/useClipboard.js +0 -175
  40. package/dist/hooks/useCommandHandler.d.ts +0 -35
  41. package/dist/hooks/useCommandHandler.js +0 -346
  42. package/dist/hooks/useCommandPanel.d.ts +0 -17
  43. package/dist/hooks/useCommandPanel.js +0 -114
  44. package/dist/hooks/useConversation.d.ts +0 -49
  45. package/dist/hooks/useConversation.js +0 -1052
  46. package/dist/hooks/useFilePicker.d.ts +0 -18
  47. package/dist/hooks/useFilePicker.js +0 -224
  48. package/dist/hooks/useGlobalExit.d.ts +0 -5
  49. package/dist/hooks/useGlobalExit.js +0 -34
  50. package/dist/hooks/useGlobalNavigation.d.ts +0 -6
  51. package/dist/hooks/useGlobalNavigation.js +0 -17
  52. package/dist/hooks/useHistoryNavigation.d.ts +0 -35
  53. package/dist/hooks/useHistoryNavigation.js +0 -133
  54. package/dist/hooks/useInputBuffer.d.ts +0 -6
  55. package/dist/hooks/useInputBuffer.js +0 -45
  56. package/dist/hooks/useKeyboardInput.d.ts +0 -80
  57. package/dist/hooks/useKeyboardInput.js +0 -608
  58. package/dist/hooks/useSessionManagement.d.ts +0 -10
  59. package/dist/hooks/useSessionManagement.js +0 -43
  60. package/dist/hooks/useSessionSave.d.ts +0 -8
  61. package/dist/hooks/useSessionSave.js +0 -63
  62. package/dist/hooks/useSnapshotState.d.ts +0 -26
  63. package/dist/hooks/useSnapshotState.js +0 -28
  64. package/dist/hooks/useStreamingState.d.ts +0 -33
  65. package/dist/hooks/useStreamingState.js +0 -105
  66. package/dist/hooks/useTerminalFocus.d.ts +0 -28
  67. package/dist/hooks/useTerminalFocus.js +0 -87
  68. package/dist/hooks/useTerminalSize.d.ts +0 -4
  69. package/dist/hooks/useTerminalSize.js +0 -20
  70. package/dist/hooks/useTodoPicker.d.ts +0 -16
  71. package/dist/hooks/useTodoPicker.js +0 -94
  72. package/dist/hooks/useToolConfirmation.d.ts +0 -19
  73. package/dist/hooks/useToolConfirmation.js +0 -61
  74. package/dist/hooks/useVSCodeState.d.ts +0 -8
  75. package/dist/hooks/useVSCodeState.js +0 -81
  76. package/dist/i18n/I18nContext.d.ts +0 -14
  77. package/dist/i18n/I18nContext.js +0 -24
  78. package/dist/i18n/index.d.ts +0 -3
  79. package/dist/i18n/index.js +0 -2
  80. package/dist/i18n/lang/en.d.ts +0 -2
  81. package/dist/i18n/lang/en.js +0 -502
  82. package/dist/i18n/lang/es.d.ts +0 -2
  83. package/dist/i18n/lang/es.js +0 -502
  84. package/dist/i18n/lang/ja.d.ts +0 -2
  85. package/dist/i18n/lang/ja.js +0 -502
  86. package/dist/i18n/lang/ko.d.ts +0 -2
  87. package/dist/i18n/lang/ko.js +0 -502
  88. package/dist/i18n/lang/zh-TW.d.ts +0 -2
  89. package/dist/i18n/lang/zh-TW.js +0 -502
  90. package/dist/i18n/lang/zh.d.ts +0 -2
  91. package/dist/i18n/lang/zh.js +0 -502
  92. package/dist/i18n/translations.d.ts +0 -2
  93. package/dist/i18n/translations.js +0 -14
  94. package/dist/i18n/types.d.ts +0 -478
  95. package/dist/i18n/types.js +0 -1
  96. package/dist/mcp/aceCodeSearch.d.ts +0 -247
  97. package/dist/mcp/aceCodeSearch.js +0 -1058
  98. package/dist/mcp/bash.d.ts +0 -50
  99. package/dist/mcp/bash.js +0 -153
  100. package/dist/mcp/codebaseSearch.d.ts +0 -44
  101. package/dist/mcp/codebaseSearch.js +0 -275
  102. package/dist/mcp/filesystem.d.ts +0 -392
  103. package/dist/mcp/filesystem.js +0 -1445
  104. package/dist/mcp/ideDiagnostics.d.ts +0 -36
  105. package/dist/mcp/ideDiagnostics.js +0 -90
  106. package/dist/mcp/notebook.d.ts +0 -10
  107. package/dist/mcp/notebook.js +0 -367
  108. package/dist/mcp/subagent.d.ts +0 -37
  109. package/dist/mcp/subagent.js +0 -113
  110. package/dist/mcp/todo.d.ts +0 -46
  111. package/dist/mcp/todo.js +0 -511
  112. package/dist/mcp/types/aceCodeSearch.types.d.ts +0 -92
  113. package/dist/mcp/types/aceCodeSearch.types.js +0 -4
  114. package/dist/mcp/types/bash.types.d.ts +0 -13
  115. package/dist/mcp/types/bash.types.js +0 -4
  116. package/dist/mcp/types/filesystem.types.d.ts +0 -210
  117. package/dist/mcp/types/filesystem.types.js +0 -27
  118. package/dist/mcp/types/todo.types.d.ts +0 -27
  119. package/dist/mcp/types/todo.types.js +0 -4
  120. package/dist/mcp/types/websearch.types.d.ts +0 -30
  121. package/dist/mcp/types/websearch.types.js +0 -4
  122. package/dist/mcp/utils/aceCodeSearch/filesystem.utils.d.ts +0 -34
  123. package/dist/mcp/utils/aceCodeSearch/filesystem.utils.js +0 -146
  124. package/dist/mcp/utils/aceCodeSearch/language.utils.d.ts +0 -14
  125. package/dist/mcp/utils/aceCodeSearch/language.utils.js +0 -418
  126. package/dist/mcp/utils/aceCodeSearch/search.utils.d.ts +0 -31
  127. package/dist/mcp/utils/aceCodeSearch/search.utils.js +0 -136
  128. package/dist/mcp/utils/aceCodeSearch/symbol.utils.d.ts +0 -20
  129. package/dist/mcp/utils/aceCodeSearch/symbol.utils.js +0 -141
  130. package/dist/mcp/utils/bash/security.utils.d.ts +0 -20
  131. package/dist/mcp/utils/bash/security.utils.js +0 -34
  132. package/dist/mcp/utils/filesystem/batch-operations.utils.d.ts +0 -39
  133. package/dist/mcp/utils/filesystem/batch-operations.utils.js +0 -182
  134. package/dist/mcp/utils/filesystem/code-analysis.utils.d.ts +0 -18
  135. package/dist/mcp/utils/filesystem/code-analysis.utils.js +0 -165
  136. package/dist/mcp/utils/filesystem/match-finder.utils.d.ts +0 -16
  137. package/dist/mcp/utils/filesystem/match-finder.utils.js +0 -85
  138. package/dist/mcp/utils/filesystem/office-parser.utils.d.ts +0 -43
  139. package/dist/mcp/utils/filesystem/office-parser.utils.js +0 -163
  140. package/dist/mcp/utils/filesystem/path-fixer.utils.d.ts +0 -7
  141. package/dist/mcp/utils/filesystem/path-fixer.utils.js +0 -60
  142. package/dist/mcp/utils/filesystem/similarity.utils.d.ts +0 -22
  143. package/dist/mcp/utils/filesystem/similarity.utils.js +0 -75
  144. package/dist/mcp/utils/todo/date.utils.d.ts +0 -9
  145. package/dist/mcp/utils/todo/date.utils.js +0 -14
  146. package/dist/mcp/utils/websearch/browser.utils.d.ts +0 -8
  147. package/dist/mcp/utils/websearch/browser.utils.js +0 -58
  148. package/dist/mcp/utils/websearch/text.utils.d.ts +0 -16
  149. package/dist/mcp/utils/websearch/text.utils.js +0 -39
  150. package/dist/mcp/websearch.d.ts +0 -88
  151. package/dist/mcp/websearch.js +0 -375
  152. package/dist/test/logger-test.d.ts +0 -1
  153. package/dist/test/logger-test.js +0 -7
  154. package/dist/types/index.d.ts +0 -15
  155. package/dist/types/index.js +0 -1
  156. package/dist/ui/components/AgentPickerPanel.d.ts +0 -10
  157. package/dist/ui/components/AgentPickerPanel.js +0 -74
  158. package/dist/ui/components/ChatInput.d.ts +0 -46
  159. package/dist/ui/components/ChatInput.js +0 -379
  160. package/dist/ui/components/CommandPanel.d.ts +0 -15
  161. package/dist/ui/components/CommandPanel.js +0 -80
  162. package/dist/ui/components/DiffViewer.d.ts +0 -11
  163. package/dist/ui/components/DiffViewer.js +0 -178
  164. package/dist/ui/components/FileList.d.ts +0 -15
  165. package/dist/ui/components/FileList.js +0 -360
  166. package/dist/ui/components/FileRollbackConfirmation.d.ts +0 -8
  167. package/dist/ui/components/FileRollbackConfirmation.js +0 -108
  168. package/dist/ui/components/HelpPanel.d.ts +0 -2
  169. package/dist/ui/components/HelpPanel.js +0 -67
  170. package/dist/ui/components/MCPInfoPanel.d.ts +0 -2
  171. package/dist/ui/components/MCPInfoPanel.js +0 -108
  172. package/dist/ui/components/MCPInfoScreen.d.ts +0 -7
  173. package/dist/ui/components/MCPInfoScreen.js +0 -115
  174. package/dist/ui/components/MarkdownRenderer.d.ts +0 -6
  175. package/dist/ui/components/MarkdownRenderer.js +0 -70
  176. package/dist/ui/components/Menu.d.ts +0 -17
  177. package/dist/ui/components/Menu.js +0 -88
  178. package/dist/ui/components/MessageList.d.ts +0 -56
  179. package/dist/ui/components/MessageList.js +0 -97
  180. package/dist/ui/components/PendingMessages.d.ts +0 -13
  181. package/dist/ui/components/PendingMessages.js +0 -29
  182. package/dist/ui/components/PendingToolCalls.d.ts +0 -11
  183. package/dist/ui/components/PendingToolCalls.js +0 -35
  184. package/dist/ui/components/ScrollableSelectInput.d.ts +0 -29
  185. package/dist/ui/components/ScrollableSelectInput.js +0 -157
  186. package/dist/ui/components/SessionListPanel.d.ts +0 -7
  187. package/dist/ui/components/SessionListPanel.js +0 -175
  188. package/dist/ui/components/SessionListScreen.d.ts +0 -7
  189. package/dist/ui/components/SessionListScreen.js +0 -217
  190. package/dist/ui/components/SessionListScreenWrapper.d.ts +0 -7
  191. package/dist/ui/components/SessionListScreenWrapper.js +0 -14
  192. package/dist/ui/components/ShimmerText.d.ts +0 -9
  193. package/dist/ui/components/ShimmerText.js +0 -30
  194. package/dist/ui/components/TodoPickerPanel.d.ts +0 -14
  195. package/dist/ui/components/TodoPickerPanel.js +0 -119
  196. package/dist/ui/components/TodoTree.d.ts +0 -15
  197. package/dist/ui/components/TodoTree.js +0 -60
  198. package/dist/ui/components/ToolConfirmation.d.ts +0 -21
  199. package/dist/ui/components/ToolConfirmation.js +0 -204
  200. package/dist/ui/components/ToolResultPreview.d.ts +0 -13
  201. package/dist/ui/components/ToolResultPreview.js +0 -337
  202. package/dist/ui/components/UsagePanel.d.ts +0 -2
  203. package/dist/ui/components/UsagePanel.js +0 -394
  204. package/dist/ui/contexts/ThemeContext.d.ts +0 -13
  205. package/dist/ui/contexts/ThemeContext.js +0 -28
  206. package/dist/ui/pages/ChatScreen.d.ts +0 -6
  207. package/dist/ui/pages/ChatScreen.js +0 -1495
  208. package/dist/ui/pages/CodeBaseConfigScreen.d.ts +0 -8
  209. package/dist/ui/pages/CodeBaseConfigScreen.js +0 -350
  210. package/dist/ui/pages/ConfigScreen.d.ts +0 -8
  211. package/dist/ui/pages/ConfigScreen.js +0 -1101
  212. package/dist/ui/pages/CustomHeadersScreen.d.ts +0 -6
  213. package/dist/ui/pages/CustomHeadersScreen.js +0 -502
  214. package/dist/ui/pages/HeadlessModeScreen.d.ts +0 -7
  215. package/dist/ui/pages/HeadlessModeScreen.js +0 -381
  216. package/dist/ui/pages/LanguageSettingsScreen.d.ts +0 -7
  217. package/dist/ui/pages/LanguageSettingsScreen.js +0 -91
  218. package/dist/ui/pages/MCPConfigScreen.d.ts +0 -6
  219. package/dist/ui/pages/MCPConfigScreen.js +0 -55
  220. package/dist/ui/pages/ProxyConfigScreen.d.ts +0 -8
  221. package/dist/ui/pages/ProxyConfigScreen.js +0 -149
  222. package/dist/ui/pages/SensitiveCommandConfigScreen.d.ts +0 -7
  223. package/dist/ui/pages/SensitiveCommandConfigScreen.js +0 -271
  224. package/dist/ui/pages/SubAgentConfigScreen.d.ts +0 -9
  225. package/dist/ui/pages/SubAgentConfigScreen.js +0 -435
  226. package/dist/ui/pages/SubAgentListScreen.d.ts +0 -9
  227. package/dist/ui/pages/SubAgentListScreen.js +0 -131
  228. package/dist/ui/pages/SystemPromptConfigScreen.d.ts +0 -6
  229. package/dist/ui/pages/SystemPromptConfigScreen.js +0 -326
  230. package/dist/ui/pages/ThemeSettingsScreen.d.ts +0 -7
  231. package/dist/ui/pages/ThemeSettingsScreen.js +0 -106
  232. package/dist/ui/pages/WelcomeScreen.d.ts +0 -7
  233. package/dist/ui/pages/WelcomeScreen.js +0 -217
  234. package/dist/ui/themes/index.d.ts +0 -23
  235. package/dist/ui/themes/index.js +0 -140
  236. package/dist/utils/apiConfig.d.ts +0 -126
  237. package/dist/utils/apiConfig.js +0 -423
  238. package/dist/utils/autoCompress.d.ts +0 -15
  239. package/dist/utils/autoCompress.js +0 -24
  240. package/dist/utils/chatExporter.d.ts +0 -9
  241. package/dist/utils/chatExporter.js +0 -118
  242. package/dist/utils/checkpointManager.d.ts +0 -74
  243. package/dist/utils/checkpointManager.js +0 -181
  244. package/dist/utils/codebaseConfig.d.ts +0 -16
  245. package/dist/utils/codebaseConfig.js +0 -67
  246. package/dist/utils/codebaseDatabase.d.ts +0 -102
  247. package/dist/utils/codebaseDatabase.js +0 -333
  248. package/dist/utils/codebaseSearchEvents.d.ts +0 -16
  249. package/dist/utils/codebaseSearchEvents.js +0 -13
  250. package/dist/utils/commandExecutor.d.ts +0 -13
  251. package/dist/utils/commandExecutor.js +0 -26
  252. package/dist/utils/commands/agent.d.ts +0 -2
  253. package/dist/utils/commands/agent.js +0 -12
  254. package/dist/utils/commands/clear.d.ts +0 -2
  255. package/dist/utils/commands/clear.js +0 -12
  256. package/dist/utils/commands/compact.d.ts +0 -2
  257. package/dist/utils/commands/compact.js +0 -12
  258. package/dist/utils/commands/export.d.ts +0 -2
  259. package/dist/utils/commands/export.js +0 -12
  260. package/dist/utils/commands/help.d.ts +0 -2
  261. package/dist/utils/commands/help.js +0 -11
  262. package/dist/utils/commands/home.d.ts +0 -2
  263. package/dist/utils/commands/home.js +0 -34
  264. package/dist/utils/commands/ide.d.ts +0 -2
  265. package/dist/utils/commands/ide.js +0 -32
  266. package/dist/utils/commands/init.d.ts +0 -2
  267. package/dist/utils/commands/init.js +0 -93
  268. package/dist/utils/commands/mcp.d.ts +0 -2
  269. package/dist/utils/commands/mcp.js +0 -12
  270. package/dist/utils/commands/resume.d.ts +0 -2
  271. package/dist/utils/commands/resume.js +0 -12
  272. package/dist/utils/commands/review.d.ts +0 -2
  273. package/dist/utils/commands/review.js +0 -81
  274. package/dist/utils/commands/role.d.ts +0 -2
  275. package/dist/utils/commands/role.js +0 -37
  276. package/dist/utils/commands/todoPicker.d.ts +0 -2
  277. package/dist/utils/commands/todoPicker.js +0 -12
  278. package/dist/utils/commands/usage.d.ts +0 -2
  279. package/dist/utils/commands/usage.js +0 -12
  280. package/dist/utils/commands/yolo.d.ts +0 -2
  281. package/dist/utils/commands/yolo.js +0 -12
  282. package/dist/utils/configManager.d.ts +0 -45
  283. package/dist/utils/configManager.js +0 -303
  284. package/dist/utils/contextCompressor.d.ts +0 -16
  285. package/dist/utils/contextCompressor.js +0 -334
  286. package/dist/utils/devMode.d.ts +0 -13
  287. package/dist/utils/devMode.js +0 -54
  288. package/dist/utils/escapeHandler.d.ts +0 -79
  289. package/dist/utils/escapeHandler.js +0 -153
  290. package/dist/utils/fileDialog.d.ts +0 -9
  291. package/dist/utils/fileDialog.js +0 -74
  292. package/dist/utils/fileUtils.d.ts +0 -40
  293. package/dist/utils/fileUtils.js +0 -185
  294. package/dist/utils/historyManager.d.ts +0 -45
  295. package/dist/utils/historyManager.js +0 -159
  296. package/dist/utils/incrementalSnapshot.d.ts +0 -109
  297. package/dist/utils/incrementalSnapshot.js +0 -383
  298. package/dist/utils/index.d.ts +0 -11
  299. package/dist/utils/index.js +0 -18
  300. package/dist/utils/languageConfig.d.ts +0 -21
  301. package/dist/utils/languageConfig.js +0 -61
  302. package/dist/utils/logger.d.ts +0 -37
  303. package/dist/utils/logger.js +0 -122
  304. package/dist/utils/mcpToolsManager.d.ts +0 -52
  305. package/dist/utils/mcpToolsManager.js +0 -878
  306. package/dist/utils/messageFormatter.d.ts +0 -12
  307. package/dist/utils/messageFormatter.js +0 -115
  308. package/dist/utils/notebookManager.d.ts +0 -59
  309. package/dist/utils/notebookManager.js +0 -213
  310. package/dist/utils/patch-highlight.d.ts +0 -5
  311. package/dist/utils/patch-highlight.js +0 -23
  312. package/dist/utils/processManager.d.ts +0 -27
  313. package/dist/utils/processManager.js +0 -75
  314. package/dist/utils/proxyUtils.d.ts +0 -15
  315. package/dist/utils/proxyUtils.js +0 -50
  316. package/dist/utils/resourceMonitor.d.ts +0 -65
  317. package/dist/utils/resourceMonitor.js +0 -175
  318. package/dist/utils/retryUtils.d.ts +0 -49
  319. package/dist/utils/retryUtils.js +0 -303
  320. package/dist/utils/sensitiveCommandManager.d.ts +0 -53
  321. package/dist/utils/sensitiveCommandManager.js +0 -308
  322. package/dist/utils/sessionConverter.d.ts +0 -7
  323. package/dist/utils/sessionConverter.js +0 -306
  324. package/dist/utils/sessionManager.d.ts +0 -53
  325. package/dist/utils/sessionManager.js +0 -371
  326. package/dist/utils/subAgentConfig.d.ts +0 -50
  327. package/dist/utils/subAgentConfig.js +0 -221
  328. package/dist/utils/subAgentExecutor.d.ts +0 -40
  329. package/dist/utils/subAgentExecutor.js +0 -434
  330. package/dist/utils/terminal.d.ts +0 -5
  331. package/dist/utils/terminal.js +0 -13
  332. package/dist/utils/textBuffer.d.ts +0 -99
  333. package/dist/utils/textBuffer.js +0 -547
  334. package/dist/utils/textUtils.d.ts +0 -37
  335. package/dist/utils/textUtils.js +0 -102
  336. package/dist/utils/themeConfig.d.ts +0 -21
  337. package/dist/utils/themeConfig.js +0 -61
  338. package/dist/utils/todoPreprocessor.d.ts +0 -5
  339. package/dist/utils/todoPreprocessor.js +0 -18
  340. package/dist/utils/todoScanner.d.ts +0 -8
  341. package/dist/utils/todoScanner.js +0 -148
  342. package/dist/utils/toolDisplayConfig.d.ts +0 -16
  343. package/dist/utils/toolDisplayConfig.js +0 -47
  344. package/dist/utils/toolExecutor.d.ts +0 -37
  345. package/dist/utils/toolExecutor.js +0 -224
  346. package/dist/utils/usageLogger.d.ts +0 -11
  347. package/dist/utils/usageLogger.js +0 -114
  348. package/dist/utils/vscodeConnection.d.ts +0 -76
  349. package/dist/utils/vscodeConnection.js +0 -430
  350. package/dist/utils/workspaceSnapshot.d.ts +0 -63
  351. package/dist/utils/workspaceSnapshot.js +0 -300
@@ -1,1101 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { Box, Text, useInput } from 'ink';
3
- import Gradient from 'ink-gradient';
4
- import { Select, Alert, Spinner } from '@inkjs/ui';
5
- import TextInput from 'ink-text-input';
6
- import { getOpenAiConfig, updateOpenAiConfig, validateApiConfig, } from '../../utils/apiConfig.js';
7
- import { fetchAvailableModels, filterModels, } from '../../api/models.js';
8
- import { getActiveProfileName, getAllProfiles, switchProfile, createProfile, deleteProfile, saveProfile, } from '../../utils/configManager.js';
9
- import { useI18n } from '../../i18n/index.js';
10
- import { useTheme } from '../contexts/ThemeContext.js';
11
- const focusEventTokenRegex = /(?:\x1b)?\[[0-9;]*[IO]/g;
12
- const isFocusEventInput = (value) => {
13
- if (!value) {
14
- return false;
15
- }
16
- if (value === '\x1b[I' ||
17
- value === '\x1b[O' ||
18
- value === '[I' ||
19
- value === '[O') {
20
- return true;
21
- }
22
- const trimmed = value.trim();
23
- if (!trimmed) {
24
- return false;
25
- }
26
- const tokens = trimmed.match(focusEventTokenRegex);
27
- if (!tokens) {
28
- return false;
29
- }
30
- const normalized = trimmed.replace(/\s+/g, '');
31
- const tokensCombined = tokens.join('');
32
- return tokensCombined === normalized;
33
- };
34
- const stripFocusArtifacts = (value) => {
35
- if (!value) {
36
- return '';
37
- }
38
- return value
39
- .replace(/\x1b\[[0-9;]*[IO]/g, '')
40
- .replace(/\[[0-9;]*[IO]/g, '')
41
- .replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
42
- };
43
- export default function ConfigScreen({ onBack, onSave, inlineMode = false, }) {
44
- const { t } = useI18n();
45
- const { theme } = useTheme();
46
- // Profile management
47
- const [profiles, setProfiles] = useState([]);
48
- const [activeProfile, setActiveProfile] = useState('');
49
- const [profileMode, setProfileMode] = useState('normal');
50
- const [newProfileName, setNewProfileName] = useState('');
51
- // API settings
52
- const [baseUrl, setBaseUrl] = useState('');
53
- const [apiKey, setApiKey] = useState('');
54
- const [requestMethod, setRequestMethod] = useState('chat');
55
- const [anthropicBeta, setAnthropicBeta] = useState(false);
56
- const [enablePromptOptimization, setEnablePromptOptimization] = useState(true);
57
- const [enableAutoCompress, setEnableAutoCompress] = useState(true);
58
- const [thinkingEnabled, setThinkingEnabled] = useState(false);
59
- const [thinkingBudgetTokens, setThinkingBudgetTokens] = useState(10000);
60
- const [geminiThinkingEnabled, setGeminiThinkingEnabled] = useState(false);
61
- const [geminiThinkingBudget, setGeminiThinkingBudget] = useState(1024);
62
- const [responsesReasoningEnabled, setResponsesReasoningEnabled] = useState(false);
63
- const [responsesReasoningEffort, setResponsesReasoningEffort] = useState('high');
64
- // Model settings
65
- const [advancedModel, setAdvancedModel] = useState('');
66
- const [basicModel, setBasicModel] = useState('');
67
- const [maxContextTokens, setMaxContextTokens] = useState(4000);
68
- const [maxTokens, setMaxTokens] = useState(4096);
69
- const [compactModelName, setCompactModelName] = useState('');
70
- // UI state
71
- const [currentField, setCurrentField] = useState('profile');
72
- const [errors, setErrors] = useState([]);
73
- const [isEditing, setIsEditing] = useState(false);
74
- const [models, setModels] = useState([]);
75
- const [loading, setLoading] = useState(false);
76
- const [loadError, setLoadError] = useState('');
77
- const [searchTerm, setSearchTerm] = useState('');
78
- const [manualInputMode, setManualInputMode] = useState(false);
79
- const [manualInputValue, setManualInputValue] = useState('');
80
- const [, forceUpdate] = useState(0);
81
- // Scrolling configuration
82
- const MAX_VISIBLE_FIELDS = 8;
83
- const requestMethodOptions = [
84
- {
85
- label: t.configScreen.requestMethodChat,
86
- value: 'chat',
87
- },
88
- {
89
- label: t.configScreen.requestMethodResponses,
90
- value: 'responses',
91
- },
92
- {
93
- label: t.configScreen.requestMethodGemini,
94
- value: 'gemini',
95
- },
96
- {
97
- label: t.configScreen.requestMethodAnthropic,
98
- value: 'anthropic',
99
- },
100
- ];
101
- // Get all available fields based on current request method
102
- const getAllFields = () => {
103
- return [
104
- 'profile',
105
- 'baseUrl',
106
- 'apiKey',
107
- 'requestMethod',
108
- 'enablePromptOptimization',
109
- 'enableAutoCompress',
110
- ...(requestMethod === 'anthropic'
111
- ? [
112
- 'anthropicBeta',
113
- 'thinkingEnabled',
114
- 'thinkingBudgetTokens',
115
- ]
116
- : requestMethod === 'gemini'
117
- ? [
118
- 'geminiThinkingEnabled',
119
- 'geminiThinkingBudget',
120
- ]
121
- : requestMethod === 'responses'
122
- ? [
123
- 'responsesReasoningEnabled',
124
- 'responsesReasoningEffort',
125
- ]
126
- : []),
127
- 'advancedModel',
128
- 'basicModel',
129
- 'compactModelName',
130
- 'maxContextTokens',
131
- 'maxTokens',
132
- ];
133
- };
134
- // Get current field index and total count
135
- const allFields = getAllFields();
136
- const currentFieldIndex = allFields.indexOf(currentField);
137
- const totalFields = allFields.length;
138
- useEffect(() => {
139
- loadProfilesAndConfig();
140
- }, []);
141
- // Auto-adjust currentField when requestMethod changes
142
- useEffect(() => {
143
- // If requestMethod is not 'anthropic' and currentField is on Anthropic-specific fields,
144
- // move to the next available field
145
- if (requestMethod !== 'anthropic' &&
146
- (currentField === 'anthropicBeta' ||
147
- currentField === 'thinkingEnabled' ||
148
- currentField === 'thinkingBudgetTokens')) {
149
- setCurrentField('advancedModel');
150
- }
151
- // If requestMethod is not 'gemini' and currentField is on Gemini-specific fields,
152
- // move to the next available field
153
- if (requestMethod !== 'gemini' &&
154
- (currentField === 'geminiThinkingEnabled' ||
155
- currentField === 'geminiThinkingBudget')) {
156
- setCurrentField('advancedModel');
157
- }
158
- // If requestMethod is not 'responses' and currentField is on Responses-specific fields,
159
- // move to the next available field
160
- if (requestMethod !== 'responses' &&
161
- (currentField === 'responsesReasoningEnabled' ||
162
- currentField === 'responsesReasoningEffort')) {
163
- setCurrentField('advancedModel');
164
- }
165
- }, [requestMethod, currentField]);
166
- const loadProfilesAndConfig = () => {
167
- // Load profiles
168
- const loadedProfiles = getAllProfiles();
169
- setProfiles(loadedProfiles);
170
- // Load current config
171
- const config = getOpenAiConfig();
172
- setBaseUrl(config.baseUrl);
173
- setApiKey(config.apiKey);
174
- setRequestMethod(config.requestMethod || 'chat');
175
- setAnthropicBeta(config.anthropicBeta || false);
176
- setEnablePromptOptimization(config.enablePromptOptimization !== false); // Default to true
177
- setEnableAutoCompress(config.enableAutoCompress !== false); // Default to true
178
- setThinkingEnabled(config.thinking?.type === 'enabled' || false);
179
- setThinkingBudgetTokens(config.thinking?.budget_tokens || 10000);
180
- setGeminiThinkingEnabled(config.geminiThinking?.enabled || false);
181
- setGeminiThinkingBudget(config.geminiThinking?.budget || 1024);
182
- setResponsesReasoningEnabled(config.responsesReasoning?.enabled || false);
183
- setResponsesReasoningEffort(config.responsesReasoning?.effort || 'high');
184
- setAdvancedModel(config.advancedModel || '');
185
- setBasicModel(config.basicModel || '');
186
- setMaxContextTokens(config.maxContextTokens || 4000);
187
- setMaxTokens(config.maxTokens || 4096);
188
- setCompactModelName(config.compactModel?.modelName || '');
189
- setActiveProfile(getActiveProfileName());
190
- };
191
- const loadModels = async () => {
192
- setLoading(true);
193
- setLoadError('');
194
- // Temporarily save current config to use the latest baseUrl/apiKey
195
- const tempConfig = {
196
- baseUrl,
197
- apiKey,
198
- requestMethod,
199
- };
200
- updateOpenAiConfig(tempConfig);
201
- try {
202
- const fetchedModels = await fetchAvailableModels();
203
- setModels(fetchedModels);
204
- }
205
- catch (err) {
206
- const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred';
207
- setLoadError(errorMessage);
208
- throw err;
209
- }
210
- finally {
211
- setLoading(false);
212
- }
213
- };
214
- const getCurrentOptions = () => {
215
- const filteredModels = filterModels(models, searchTerm);
216
- const modelOptions = filteredModels.map(model => ({
217
- label: model.id,
218
- value: model.id,
219
- }));
220
- return [
221
- { label: t.configScreen.manualInputOption, value: '__MANUAL_INPUT__' },
222
- ...modelOptions,
223
- ];
224
- };
225
- const getCurrentValue = () => {
226
- if (currentField === 'profile')
227
- return activeProfile;
228
- if (currentField === 'baseUrl')
229
- return baseUrl;
230
- if (currentField === 'apiKey')
231
- return apiKey;
232
- if (currentField === 'advancedModel')
233
- return advancedModel;
234
- if (currentField === 'basicModel')
235
- return basicModel;
236
- if (currentField === 'maxContextTokens')
237
- return maxContextTokens.toString();
238
- if (currentField === 'maxTokens')
239
- return maxTokens.toString();
240
- if (currentField === 'thinkingBudgetTokens')
241
- return thinkingBudgetTokens.toString();
242
- if (currentField === 'geminiThinkingBudget')
243
- return geminiThinkingBudget.toString();
244
- if (currentField === 'responsesReasoningEffort')
245
- return responsesReasoningEffort;
246
- if (currentField === 'compactModelName')
247
- return compactModelName;
248
- return '';
249
- };
250
- const handleCreateProfile = () => {
251
- const cleaned = stripFocusArtifacts(newProfileName).trim();
252
- if (!cleaned) {
253
- setErrors([t.configScreen.profileNameEmpty]);
254
- return;
255
- }
256
- try {
257
- // Create new profile with current config
258
- const currentConfig = {
259
- snowcfg: {
260
- baseUrl,
261
- apiKey,
262
- requestMethod,
263
- anthropicBeta,
264
- thinking: thinkingEnabled
265
- ? { type: 'enabled', budget_tokens: thinkingBudgetTokens }
266
- : undefined,
267
- advancedModel,
268
- basicModel,
269
- maxContextTokens,
270
- maxTokens,
271
- compactModel: compactModelName
272
- ? { modelName: compactModelName }
273
- : undefined,
274
- },
275
- };
276
- createProfile(cleaned, currentConfig);
277
- switchProfile(cleaned);
278
- loadProfilesAndConfig();
279
- setProfileMode('normal');
280
- setNewProfileName('');
281
- setIsEditing(false);
282
- setErrors([]);
283
- }
284
- catch (err) {
285
- setErrors([
286
- err instanceof Error ? err.message : 'Failed to create profile',
287
- ]);
288
- }
289
- };
290
- const handleDeleteProfile = () => {
291
- try {
292
- deleteProfile(activeProfile);
293
- // Important: Update activeProfile state BEFORE loading profiles
294
- // because deleteProfile switches to 'default' if the active profile is deleted
295
- const newActiveProfile = getActiveProfileName();
296
- setActiveProfile(newActiveProfile);
297
- loadProfilesAndConfig();
298
- setProfileMode('normal');
299
- setIsEditing(false);
300
- setErrors([]);
301
- }
302
- catch (err) {
303
- setErrors([
304
- err instanceof Error ? err.message : 'Failed to delete profile',
305
- ]);
306
- setProfileMode('normal');
307
- }
308
- };
309
- const handleModelChange = (value) => {
310
- if (value === '__MANUAL_INPUT__') {
311
- setManualInputMode(true);
312
- setManualInputValue('');
313
- return;
314
- }
315
- if (currentField === 'advancedModel') {
316
- setAdvancedModel(value);
317
- }
318
- else if (currentField === 'basicModel') {
319
- setBasicModel(value);
320
- }
321
- else if (currentField === 'compactModelName') {
322
- setCompactModelName(value);
323
- }
324
- setIsEditing(false);
325
- setSearchTerm('');
326
- };
327
- const saveConfiguration = () => {
328
- const validationErrors = validateApiConfig({
329
- baseUrl,
330
- apiKey,
331
- requestMethod,
332
- });
333
- if (validationErrors.length === 0) {
334
- const config = {
335
- baseUrl,
336
- apiKey,
337
- requestMethod,
338
- anthropicBeta,
339
- enablePromptOptimization,
340
- enableAutoCompress,
341
- advancedModel,
342
- basicModel,
343
- maxContextTokens,
344
- maxTokens,
345
- };
346
- // Save thinking configuration (always save to preserve settings)
347
- if (thinkingEnabled) {
348
- config.thinking = {
349
- type: 'enabled',
350
- budget_tokens: thinkingBudgetTokens,
351
- };
352
- }
353
- else {
354
- // Explicitly set to undefined to clear it when disabled
355
- config.thinking = undefined;
356
- }
357
- // Save Gemini thinking configuration
358
- if (geminiThinkingEnabled) {
359
- config.geminiThinking = {
360
- enabled: true,
361
- budget: geminiThinkingBudget,
362
- };
363
- }
364
- else {
365
- config.geminiThinking = undefined;
366
- }
367
- // Save Responses reasoning configuration
368
- if (responsesReasoningEnabled) {
369
- config.responsesReasoning = {
370
- enabled: true,
371
- effort: responsesReasoningEffort,
372
- };
373
- }
374
- else {
375
- config.responsesReasoning = undefined;
376
- }
377
- // Only save compactModel if modelName is provided (uses same baseUrl/apiKey)
378
- if (compactModelName) {
379
- config.compactModel = {
380
- modelName: compactModelName,
381
- };
382
- }
383
- // Save to main config
384
- updateOpenAiConfig(config);
385
- // Also save to the current profile
386
- try {
387
- const fullConfig = {
388
- snowcfg: {
389
- baseUrl,
390
- apiKey,
391
- requestMethod,
392
- anthropicBeta,
393
- enablePromptOptimization,
394
- enableAutoCompress,
395
- thinking: thinkingEnabled
396
- ? { type: 'enabled', budget_tokens: thinkingBudgetTokens }
397
- : undefined,
398
- geminiThinking: geminiThinkingEnabled
399
- ? { enabled: true, budget: geminiThinkingBudget }
400
- : undefined,
401
- responsesReasoning: responsesReasoningEnabled
402
- ? { enabled: true, effort: responsesReasoningEffort }
403
- : undefined,
404
- advancedModel,
405
- basicModel,
406
- maxContextTokens,
407
- maxTokens,
408
- compactModel: compactModelName
409
- ? { modelName: compactModelName }
410
- : undefined,
411
- },
412
- };
413
- saveProfile(activeProfile, fullConfig);
414
- }
415
- catch (err) {
416
- console.error('Failed to save profile:', err);
417
- }
418
- setErrors([]);
419
- return true;
420
- }
421
- else {
422
- setErrors(validationErrors);
423
- return false;
424
- }
425
- };
426
- // Helper function to render a single field
427
- const renderField = (field) => {
428
- const isActive = field === currentField;
429
- const isCurrentlyEditing = isEditing && isActive;
430
- switch (field) {
431
- case 'profile':
432
- return (React.createElement(Box, { key: field, flexDirection: "column" },
433
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
434
- isActive ? '❯ ' : ' ',
435
- t.configScreen.profile),
436
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
437
- React.createElement(Text, { color: theme.colors.menuSecondary }, profiles.find(p => p.name === activeProfile)?.displayName ||
438
- activeProfile)))));
439
- case 'baseUrl':
440
- return (React.createElement(Box, { key: field, flexDirection: "column" },
441
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
442
- isActive ? '❯ ' : ' ',
443
- t.configScreen.baseUrl),
444
- isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
445
- React.createElement(TextInput, { value: baseUrl, onChange: value => setBaseUrl(stripFocusArtifacts(value)), placeholder: "https://api.openai.com/v1" }))),
446
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
447
- React.createElement(Text, { color: theme.colors.menuSecondary }, baseUrl || t.configScreen.notSet)))));
448
- case 'apiKey':
449
- return (React.createElement(Box, { key: field, flexDirection: "column" },
450
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
451
- isActive ? '❯ ' : ' ',
452
- t.configScreen.apiKey),
453
- isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
454
- React.createElement(TextInput, { value: apiKey, onChange: value => setApiKey(stripFocusArtifacts(value)), placeholder: "sk-...", mask: "*" }))),
455
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
456
- React.createElement(Text, { color: theme.colors.menuSecondary }, apiKey ? '*'.repeat(Math.min(apiKey.length, 20)) : t.configScreen.notSet)))));
457
- case 'requestMethod':
458
- return (React.createElement(Box, { key: field, flexDirection: "column" },
459
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
460
- isActive ? '❯ ' : ' ',
461
- t.configScreen.requestMethod),
462
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
463
- React.createElement(Text, { color: theme.colors.menuSecondary }, requestMethodOptions.find(opt => opt.value === requestMethod)
464
- ?.label || t.configScreen.notSet)))));
465
- case 'anthropicBeta':
466
- return (React.createElement(Box, { key: field, flexDirection: "column" },
467
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
468
- isActive ? '❯ ' : ' ',
469
- t.configScreen.anthropicBeta),
470
- React.createElement(Box, { marginLeft: 3 },
471
- React.createElement(Text, { color: theme.colors.menuSecondary },
472
- anthropicBeta ? t.configScreen.enabled : t.configScreen.disabled,
473
- " ",
474
- t.configScreen.toggleHint))));
475
- case 'enablePromptOptimization':
476
- return (React.createElement(Box, { key: field, flexDirection: "column" },
477
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
478
- isActive ? '❯ ' : ' ',
479
- t.configScreen.enablePromptOptimization),
480
- React.createElement(Box, { marginLeft: 3 },
481
- React.createElement(Text, { color: theme.colors.menuSecondary },
482
- enablePromptOptimization ? t.configScreen.enabled : t.configScreen.disabled,
483
- " ",
484
- t.configScreen.toggleHint))));
485
- case 'enableAutoCompress':
486
- return (React.createElement(Box, { key: field, flexDirection: "column" },
487
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
488
- isActive ? '❯ ' : ' ',
489
- t.configScreen.enableAutoCompress),
490
- React.createElement(Box, { marginLeft: 3 },
491
- React.createElement(Text, { color: theme.colors.menuSecondary },
492
- enableAutoCompress ? t.configScreen.enabled : t.configScreen.disabled,
493
- " ",
494
- t.configScreen.toggleHint))));
495
- case 'thinkingEnabled':
496
- return (React.createElement(Box, { key: field, flexDirection: "column" },
497
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
498
- isActive ? '❯ ' : ' ',
499
- t.configScreen.thinkingEnabled),
500
- React.createElement(Box, { marginLeft: 3 },
501
- React.createElement(Text, { color: theme.colors.menuSecondary },
502
- thinkingEnabled ? t.configScreen.enabled : t.configScreen.disabled,
503
- " ",
504
- t.configScreen.toggleHint))));
505
- case 'thinkingBudgetTokens':
506
- return (React.createElement(Box, { key: field, flexDirection: "column" },
507
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
508
- isActive ? '❯ ' : ' ',
509
- t.configScreen.thinkingBudgetTokens),
510
- isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
511
- React.createElement(Text, { color: theme.colors.menuInfo },
512
- t.configScreen.enterValue,
513
- " ",
514
- thinkingBudgetTokens))),
515
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
516
- React.createElement(Text, { color: theme.colors.menuSecondary }, thinkingBudgetTokens)))));
517
- case 'geminiThinkingEnabled':
518
- return (React.createElement(Box, { key: field, flexDirection: "column" },
519
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
520
- isActive ? '❯ ' : ' ',
521
- t.configScreen.geminiThinkingEnabled),
522
- React.createElement(Box, { marginLeft: 3 },
523
- React.createElement(Text, { color: theme.colors.menuSecondary },
524
- geminiThinkingEnabled ? t.configScreen.enabled : t.configScreen.disabled,
525
- " ",
526
- t.configScreen.toggleHint))));
527
- case 'geminiThinkingBudget':
528
- return (React.createElement(Box, { key: field, flexDirection: "column" },
529
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
530
- isActive ? '❯ ' : ' ',
531
- t.configScreen.geminiThinkingBudget),
532
- isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
533
- React.createElement(Text, { color: theme.colors.menuInfo },
534
- t.configScreen.enterValue,
535
- " ",
536
- geminiThinkingBudget))),
537
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
538
- React.createElement(Text, { color: theme.colors.menuSecondary }, geminiThinkingBudget)))));
539
- case 'responsesReasoningEnabled':
540
- return (React.createElement(Box, { key: field, flexDirection: "column" },
541
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
542
- isActive ? '❯ ' : ' ',
543
- t.configScreen.responsesReasoningEnabled),
544
- React.createElement(Box, { marginLeft: 3 },
545
- React.createElement(Text, { color: theme.colors.menuSecondary },
546
- responsesReasoningEnabled ? t.configScreen.enabled : t.configScreen.disabled,
547
- ' ',
548
- t.configScreen.toggleHint))));
549
- case 'responsesReasoningEffort':
550
- return (React.createElement(Box, { key: field, flexDirection: "column" },
551
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
552
- isActive ? '❯ ' : ' ',
553
- t.configScreen.responsesReasoningEffort),
554
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
555
- React.createElement(Text, { color: theme.colors.menuSecondary }, responsesReasoningEffort.toUpperCase()))),
556
- isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
557
- React.createElement(Select, { options: [
558
- { label: 'LOW', value: 'low' },
559
- { label: 'MEDIUM', value: 'medium' },
560
- { label: 'HIGH', value: 'high' },
561
- { label: 'XHIGH', value: 'xhigh' },
562
- ], defaultValue: responsesReasoningEffort, onChange: value => {
563
- setResponsesReasoningEffort(value);
564
- setIsEditing(false);
565
- } })))));
566
- case 'advancedModel':
567
- return (React.createElement(Box, { key: field, flexDirection: "column" },
568
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
569
- isActive ? '❯ ' : ' ',
570
- t.configScreen.advancedModel),
571
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
572
- React.createElement(Text, { color: theme.colors.menuSecondary }, advancedModel || t.configScreen.notSet)))));
573
- case 'basicModel':
574
- return (React.createElement(Box, { key: field, flexDirection: "column" },
575
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
576
- isActive ? '❯ ' : ' ',
577
- t.configScreen.basicModel),
578
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
579
- React.createElement(Text, { color: theme.colors.menuSecondary }, basicModel || t.configScreen.notSet)))));
580
- case 'compactModelName':
581
- return (React.createElement(Box, { key: field, flexDirection: "column" },
582
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
583
- isActive ? '❯ ' : ' ',
584
- t.configScreen.compactModel),
585
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
586
- React.createElement(Text, { color: theme.colors.menuSecondary }, compactModelName || t.configScreen.notSet)))));
587
- case 'maxContextTokens':
588
- return (React.createElement(Box, { key: field, flexDirection: "column" },
589
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
590
- isActive ? '❯ ' : ' ',
591
- t.configScreen.maxContextTokens),
592
- isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
593
- React.createElement(Text, { color: theme.colors.menuInfo },
594
- t.configScreen.enterValue,
595
- " ",
596
- maxContextTokens))),
597
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
598
- React.createElement(Text, { color: theme.colors.menuSecondary }, maxContextTokens)))));
599
- case 'maxTokens':
600
- return (React.createElement(Box, { key: field, flexDirection: "column" },
601
- React.createElement(Text, { color: isActive ? theme.colors.menuSelected : theme.colors.menuNormal },
602
- isActive ? '❯ ' : ' ',
603
- t.configScreen.maxTokens),
604
- isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
605
- React.createElement(Text, { color: theme.colors.menuInfo },
606
- t.configScreen.enterValue,
607
- " ",
608
- maxTokens))),
609
- !isCurrentlyEditing && (React.createElement(Box, { marginLeft: 3 },
610
- React.createElement(Text, { color: theme.colors.menuSecondary }, maxTokens)))));
611
- default:
612
- return null;
613
- }
614
- };
615
- useInput((rawInput, key) => {
616
- const input = stripFocusArtifacts(rawInput);
617
- if (!input && isFocusEventInput(rawInput)) {
618
- return;
619
- }
620
- if (isFocusEventInput(rawInput)) {
621
- return;
622
- }
623
- // Handle profile creation mode
624
- if (profileMode === 'creating') {
625
- if (key.return) {
626
- handleCreateProfile();
627
- }
628
- else if (key.escape) {
629
- setProfileMode('normal');
630
- setNewProfileName('');
631
- setErrors([]);
632
- }
633
- return;
634
- }
635
- // Handle profile deletion confirmation
636
- if (profileMode === 'deleting') {
637
- if (input === 'y' || input === 'Y') {
638
- handleDeleteProfile();
639
- }
640
- else if (input === 'n' || input === 'N' || key.escape) {
641
- setProfileMode('normal');
642
- setErrors([]);
643
- }
644
- return;
645
- }
646
- // Handle profile shortcuts (only when in normal profile mode)
647
- if (profileMode === 'normal' &&
648
- currentField === 'profile' &&
649
- (input === 'n' || input === 'N')) {
650
- // Handle profile creation (works in both normal and editing mode)
651
- setProfileMode('creating');
652
- setNewProfileName('');
653
- setIsEditing(false); // Exit Select editing mode
654
- return;
655
- }
656
- if (profileMode === 'normal' &&
657
- currentField === 'profile' &&
658
- (input === 'd' || input === 'D')) {
659
- // Handle profile deletion (works in both normal and editing mode)
660
- if (activeProfile === 'default') {
661
- setErrors([t.configScreen.cannotDeleteDefault]);
662
- setIsEditing(false);
663
- return;
664
- }
665
- setProfileMode('deleting');
666
- setIsEditing(false); // Exit Select editing mode
667
- return;
668
- }
669
- // Handle loading state
670
- if (loading) {
671
- if (key.escape) {
672
- setLoading(false);
673
- }
674
- return;
675
- }
676
- // Handle manual input mode
677
- if (manualInputMode) {
678
- if (key.return) {
679
- const cleaned = stripFocusArtifacts(manualInputValue).trim();
680
- if (cleaned) {
681
- if (currentField === 'advancedModel') {
682
- setAdvancedModel(cleaned);
683
- }
684
- else if (currentField === 'basicModel') {
685
- setBasicModel(cleaned);
686
- }
687
- else if (currentField === 'compactModelName') {
688
- setCompactModelName(cleaned);
689
- }
690
- }
691
- setManualInputMode(false);
692
- setManualInputValue('');
693
- setIsEditing(false);
694
- setSearchTerm('');
695
- }
696
- else if (key.escape) {
697
- setManualInputMode(false);
698
- setManualInputValue('');
699
- }
700
- else if (key.backspace || key.delete) {
701
- setManualInputValue(prev => prev.slice(0, -1));
702
- }
703
- else if (input && input.match(/[a-zA-Z0-9-_./:]/)) {
704
- setManualInputValue(prev => prev + stripFocusArtifacts(input));
705
- }
706
- return;
707
- }
708
- // Allow Escape key to exit Select component
709
- if (isEditing &&
710
- (currentField === 'profile' ||
711
- currentField === 'requestMethod' ||
712
- currentField === 'advancedModel' ||
713
- currentField === 'basicModel' ||
714
- currentField === 'compactModelName' ||
715
- currentField === 'responsesReasoningEffort') &&
716
- key.escape) {
717
- setIsEditing(false);
718
- setSearchTerm('');
719
- // Force re-render to clear Select component artifacts
720
- forceUpdate(prev => prev + 1);
721
- return;
722
- }
723
- // Handle editing mode
724
- if (isEditing) {
725
- // For baseUrl and apiKey, TextInput component handles all input, just handle Return to exit
726
- if (currentField === 'baseUrl' || currentField === 'apiKey') {
727
- if (key.return) {
728
- setIsEditing(false);
729
- }
730
- return;
731
- }
732
- // Handle numeric input for token fields
733
- if (currentField === 'maxContextTokens' ||
734
- currentField === 'maxTokens' ||
735
- currentField === 'thinkingBudgetTokens' ||
736
- currentField === 'geminiThinkingBudget') {
737
- if (input && input.match(/[0-9]/)) {
738
- const currentValue = currentField === 'maxContextTokens'
739
- ? maxContextTokens
740
- : currentField === 'maxTokens'
741
- ? maxTokens
742
- : currentField === 'thinkingBudgetTokens'
743
- ? thinkingBudgetTokens
744
- : geminiThinkingBudget;
745
- const newValue = parseInt(currentValue.toString() + input, 10);
746
- if (!isNaN(newValue)) {
747
- if (currentField === 'maxContextTokens') {
748
- setMaxContextTokens(newValue);
749
- }
750
- else if (currentField === 'maxTokens') {
751
- setMaxTokens(newValue);
752
- }
753
- else if (currentField === 'thinkingBudgetTokens') {
754
- setThinkingBudgetTokens(newValue);
755
- }
756
- else {
757
- setGeminiThinkingBudget(newValue);
758
- }
759
- }
760
- }
761
- else if (key.backspace || key.delete) {
762
- const currentValue = currentField === 'maxContextTokens'
763
- ? maxContextTokens
764
- : currentField === 'maxTokens'
765
- ? maxTokens
766
- : currentField === 'thinkingBudgetTokens'
767
- ? thinkingBudgetTokens
768
- : geminiThinkingBudget;
769
- const currentStr = currentValue.toString();
770
- const newStr = currentStr.slice(0, -1);
771
- const newValue = parseInt(newStr, 10);
772
- if (currentField === 'maxContextTokens') {
773
- setMaxContextTokens(!isNaN(newValue) ? newValue : 0);
774
- }
775
- else if (currentField === 'maxTokens') {
776
- setMaxTokens(!isNaN(newValue) ? newValue : 0);
777
- }
778
- else if (currentField === 'thinkingBudgetTokens') {
779
- setThinkingBudgetTokens(!isNaN(newValue) ? newValue : 0);
780
- }
781
- else {
782
- setGeminiThinkingBudget(!isNaN(newValue) ? newValue : 0);
783
- }
784
- }
785
- else if (key.return) {
786
- const minValue = currentField === 'maxContextTokens'
787
- ? 4000
788
- : currentField === 'maxTokens'
789
- ? 100
790
- : currentField === 'thinkingBudgetTokens'
791
- ? 1000
792
- : 1;
793
- const currentValue = currentField === 'maxContextTokens'
794
- ? maxContextTokens
795
- : currentField === 'maxTokens'
796
- ? maxTokens
797
- : currentField === 'thinkingBudgetTokens'
798
- ? thinkingBudgetTokens
799
- : geminiThinkingBudget;
800
- const finalValue = currentValue < minValue ? minValue : currentValue;
801
- if (currentField === 'maxContextTokens') {
802
- setMaxContextTokens(finalValue);
803
- }
804
- else if (currentField === 'maxTokens') {
805
- setMaxTokens(finalValue);
806
- }
807
- else if (currentField === 'thinkingBudgetTokens') {
808
- setThinkingBudgetTokens(finalValue);
809
- }
810
- else {
811
- setGeminiThinkingBudget(finalValue);
812
- }
813
- setIsEditing(false);
814
- }
815
- return;
816
- }
817
- // Allow typing to filter for model selection
818
- if (input && input.match(/[a-zA-Z0-9-_.]/)) {
819
- setSearchTerm(prev => prev + input);
820
- }
821
- else if (key.backspace || key.delete) {
822
- setSearchTerm(prev => prev.slice(0, -1));
823
- }
824
- return;
825
- }
826
- // Handle save/exit globally
827
- if (input === 's' && (key.ctrl || key.meta)) {
828
- if (saveConfiguration()) {
829
- onSave();
830
- }
831
- }
832
- else if (key.escape) {
833
- saveConfiguration();
834
- onBack();
835
- }
836
- else if (key.return) {
837
- if (isEditing) {
838
- setIsEditing(false);
839
- }
840
- else {
841
- // Enter edit mode
842
- if (currentField === 'anthropicBeta') {
843
- setAnthropicBeta(!anthropicBeta);
844
- }
845
- else if (currentField === 'enablePromptOptimization') {
846
- setEnablePromptOptimization(!enablePromptOptimization);
847
- }
848
- else if (currentField === 'enableAutoCompress') {
849
- setEnableAutoCompress(!enableAutoCompress);
850
- }
851
- else if (currentField === 'thinkingEnabled') {
852
- setThinkingEnabled(!thinkingEnabled);
853
- }
854
- else if (currentField === 'geminiThinkingEnabled') {
855
- setGeminiThinkingEnabled(!geminiThinkingEnabled);
856
- }
857
- else if (currentField === 'responsesReasoningEnabled') {
858
- setResponsesReasoningEnabled(!responsesReasoningEnabled);
859
- }
860
- else if (currentField === 'maxContextTokens' ||
861
- currentField === 'maxTokens' ||
862
- currentField === 'thinkingBudgetTokens' ||
863
- currentField === 'geminiThinkingBudget') {
864
- setIsEditing(true);
865
- }
866
- else if (currentField === 'responsesReasoningEffort') {
867
- setIsEditing(true);
868
- }
869
- else if (currentField === 'advancedModel' ||
870
- currentField === 'basicModel' ||
871
- currentField === 'compactModelName') {
872
- // Load models for model fields
873
- setLoadError(''); // Clear previous error
874
- loadModels()
875
- .then(() => {
876
- setIsEditing(true);
877
- })
878
- .catch(() => {
879
- // Error is already set in loadModels, just enter manual input mode
880
- setManualInputMode(true);
881
- setManualInputValue(getCurrentValue());
882
- });
883
- }
884
- else {
885
- setIsEditing(true);
886
- }
887
- }
888
- }
889
- else if (input === 'm' && !isEditing) {
890
- // Shortcut: press 'm' for manual input mode
891
- if (currentField === 'advancedModel' ||
892
- currentField === 'basicModel' ||
893
- currentField === 'compactModelName') {
894
- setManualInputMode(true);
895
- setManualInputValue(getCurrentValue());
896
- }
897
- }
898
- else if (!isEditing && key.upArrow) {
899
- const fields = getAllFields();
900
- const currentIndex = fields.indexOf(currentField);
901
- if (currentIndex > 0) {
902
- setCurrentField(fields[currentIndex - 1]);
903
- }
904
- }
905
- else if (!isEditing && key.downArrow) {
906
- const fields = getAllFields();
907
- const currentIndex = fields.indexOf(currentField);
908
- if (currentIndex < fields.length - 1) {
909
- setCurrentField(fields[currentIndex + 1]);
910
- }
911
- }
912
- });
913
- // Render profile creation mode
914
- if (profileMode === 'creating') {
915
- return (React.createElement(Box, { flexDirection: "column", padding: 1 },
916
- !inlineMode && (React.createElement(Box, { marginBottom: 1, borderStyle: "double", borderColor: theme.colors.menuInfo, paddingX: 2 },
917
- React.createElement(Box, { flexDirection: "column" },
918
- React.createElement(Gradient, { name: "rainbow" }, t.configScreen.createNewProfile),
919
- React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, t.configScreen.enterProfileName)))),
920
- React.createElement(Box, { flexDirection: "column" },
921
- React.createElement(Text, { color: theme.colors.menuInfo }, "Profile Name:"),
922
- React.createElement(Box, { marginLeft: 2 },
923
- React.createElement(TextInput, { value: newProfileName, onChange: value => setNewProfileName(stripFocusArtifacts(value)), placeholder: t.configScreen.profileNamePlaceholder }))),
924
- errors.length > 0 && (React.createElement(Box, { marginTop: 1 },
925
- React.createElement(Text, { color: theme.colors.error }, errors[0]))),
926
- React.createElement(Box, { marginTop: 1 },
927
- React.createElement(Alert, { variant: "info" }, t.configScreen.createHint))));
928
- }
929
- // Render profile deletion confirmation
930
- if (profileMode === 'deleting') {
931
- return (React.createElement(Box, { flexDirection: "column", padding: 1 },
932
- !inlineMode && (React.createElement(Box, { marginBottom: 1, borderStyle: "double", borderColor: theme.colors.menuInfo, paddingX: 2 },
933
- React.createElement(Box, { flexDirection: "column" },
934
- React.createElement(Gradient, { name: "rainbow" }, t.configScreen.deleteProfile),
935
- React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, t.configScreen.confirmDelete)))),
936
- React.createElement(Box, { flexDirection: "column" },
937
- React.createElement(Text, { color: theme.colors.warning },
938
- "Are you sure you want to delete the profile \"",
939
- activeProfile,
940
- "\"?"),
941
- React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, t.configScreen.deleteWarning)),
942
- errors.length > 0 && (React.createElement(Box, { marginTop: 1 },
943
- React.createElement(Text, { color: theme.colors.error }, errors[0]))),
944
- React.createElement(Box, { marginTop: 1 },
945
- React.createElement(Alert, { variant: "warning" }, t.configScreen.confirmHint))));
946
- }
947
- if (loading) {
948
- return (React.createElement(Box, { flexDirection: "column", padding: 1 },
949
- !inlineMode && (React.createElement(Box, { marginBottom: 1, borderStyle: "double", borderColor: theme.colors.menuInfo, paddingX: 2 },
950
- React.createElement(Box, { flexDirection: "column" },
951
- React.createElement(Gradient, { name: "rainbow" }, t.configScreen.title),
952
- React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, t.configScreen.loadingMessage)))),
953
- React.createElement(Box, { flexDirection: "column" },
954
- React.createElement(Box, null,
955
- React.createElement(Spinner, { type: "dots" }),
956
- React.createElement(Text, { color: theme.colors.menuInfo },
957
- " ",
958
- t.configScreen.fetchingModels)),
959
- React.createElement(Box, { marginLeft: 2 },
960
- React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, t.configScreen.fetchingHint))),
961
- React.createElement(Box, { flexDirection: "column", marginTop: 1 },
962
- React.createElement(Alert, { variant: "info" }, t.configScreen.loadingCancelHint))));
963
- }
964
- if (manualInputMode) {
965
- return (React.createElement(Box, { flexDirection: "column", padding: 1 },
966
- !inlineMode && (React.createElement(Box, { marginBottom: 1, borderStyle: "double", borderColor: theme.colors.menuInfo, paddingX: 2 },
967
- React.createElement(Box, { flexDirection: "column" },
968
- React.createElement(Gradient, { name: "rainbow" }, t.configScreen.manualInputTitle),
969
- React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, t.configScreen.manualInputSubtitle)))),
970
- loadError && (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
971
- React.createElement(Text, { color: theme.colors.warning }, t.configScreen.loadingError),
972
- React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, loadError))),
973
- React.createElement(Box, { flexDirection: "column" },
974
- React.createElement(Text, { color: theme.colors.menuInfo },
975
- currentField === 'advancedModel' && t.configScreen.advancedModel,
976
- currentField === 'basicModel' && t.configScreen.basicModel,
977
- currentField === 'compactModelName' && t.configScreen.compactModel),
978
- React.createElement(Box, { marginLeft: 2 },
979
- React.createElement(Text, { color: theme.colors.menuSelected },
980
- `> ${manualInputValue}`,
981
- React.createElement(Text, { color: theme.colors.menuNormal }, "_")))),
982
- React.createElement(Box, { flexDirection: "column", marginTop: 1 },
983
- React.createElement(Alert, { variant: "info" }, t.configScreen.manualInputHint))));
984
- }
985
- return (React.createElement(Box, { flexDirection: "column", padding: 1 },
986
- !inlineMode && (React.createElement(Box, { marginBottom: 1, borderStyle: "double", borderColor: theme.colors.menuInfo, paddingX: 2 },
987
- React.createElement(Box, { flexDirection: "column" },
988
- React.createElement(Gradient, { name: "rainbow" }, t.configScreen.title),
989
- React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, t.configScreen.subtitle),
990
- activeProfile && (React.createElement(Text, { color: theme.colors.menuInfo, dimColor: true },
991
- t.configScreen.activeProfile,
992
- " ",
993
- activeProfile))))),
994
- React.createElement(Box, { marginBottom: 1 },
995
- React.createElement(Text, { color: theme.colors.warning, bold: true },
996
- t.configScreen.settingsPosition,
997
- " (",
998
- currentFieldIndex + 1,
999
- "/",
1000
- totalFields,
1001
- ")"),
1002
- totalFields > MAX_VISIBLE_FIELDS && (React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, t.configScreen.scrollHint))),
1003
- isEditing &&
1004
- (currentField === 'profile' ||
1005
- currentField === 'requestMethod' ||
1006
- currentField === 'advancedModel' ||
1007
- currentField === 'basicModel' ||
1008
- currentField === 'compactModelName' ||
1009
- currentField === 'responsesReasoningEffort') ? (React.createElement(Box, { flexDirection: "column" },
1010
- React.createElement(Text, { color: theme.colors.menuSelected },
1011
- "\u276F ",
1012
- currentField === 'profile' && t.configScreen.profile.replace(':', ''),
1013
- currentField === 'requestMethod' && t.configScreen.requestMethod.replace(':', ''),
1014
- currentField === 'advancedModel' && t.configScreen.advancedModel.replace(':', ''),
1015
- currentField === 'basicModel' && t.configScreen.basicModel.replace(':', ''),
1016
- currentField === 'compactModelName' && t.configScreen.compactModel.replace(':', ''),
1017
- currentField === 'responsesReasoningEffort' &&
1018
- t.configScreen.responsesReasoningEffort.replace(':', '')),
1019
- React.createElement(Box, { marginLeft: 3, marginTop: 1 },
1020
- currentField === 'profile' && (React.createElement(Box, { flexDirection: "column" },
1021
- profiles.length > 1 && (React.createElement(Text, { color: theme.colors.menuSecondary, dimColor: true }, "Scroll to see more profiles (\u2191\u2193)")),
1022
- React.createElement(Select, { options: profiles.map(p => ({
1023
- label: `${p.displayName}${p.isActive ? ' (Active)' : ''}`,
1024
- value: p.name,
1025
- })), defaultValue: activeProfile, onChange: value => {
1026
- switchProfile(value);
1027
- loadProfilesAndConfig();
1028
- setIsEditing(false);
1029
- setErrors([]);
1030
- } }),
1031
- React.createElement(Box, { flexDirection: "row", marginTop: 1 },
1032
- React.createElement(Box, { marginRight: 2 },
1033
- React.createElement(Text, { color: theme.colors.menuSelected }, t.configScreen.newProfile),
1034
- React.createElement(Text, { color: theme.colors.menuSecondary }, " (n)")),
1035
- React.createElement(Box, null,
1036
- React.createElement(Text, { color: theme.colors.error }, t.configScreen.deleteProfileShort),
1037
- React.createElement(Text, { color: theme.colors.menuSecondary }, " (d)"))))),
1038
- currentField === 'requestMethod' && (React.createElement(Select, { options: requestMethodOptions, defaultValue: requestMethod, onChange: value => {
1039
- setRequestMethod(value);
1040
- setIsEditing(false);
1041
- } })),
1042
- (currentField === 'advancedModel' ||
1043
- currentField === 'basicModel' ||
1044
- currentField === 'compactModelName') && (React.createElement(Box, { flexDirection: "column" },
1045
- searchTerm && React.createElement(Text, { color: theme.colors.menuInfo },
1046
- "Filter: ",
1047
- searchTerm),
1048
- React.createElement(Select, { options: getCurrentOptions(), defaultValue: getCurrentValue(), onChange: handleModelChange }))),
1049
- currentField === 'responsesReasoningEffort' && (React.createElement(Select, { options: [
1050
- { label: 'LOW', value: 'low' },
1051
- { label: 'MEDIUM', value: 'medium' },
1052
- { label: 'HIGH', value: 'high' },
1053
- { label: 'XHIGH', value: 'xhigh' },
1054
- ], defaultValue: responsesReasoningEffort, onChange: value => {
1055
- setResponsesReasoningEffort(value);
1056
- setIsEditing(false);
1057
- } }))),
1058
- React.createElement(Box, { marginTop: 1 },
1059
- React.createElement(Alert, { variant: "info" },
1060
- (currentField === 'advancedModel' ||
1061
- currentField === 'basicModel' ||
1062
- currentField === 'compactModelName') &&
1063
- t.configScreen.modelFilterHint,
1064
- currentField === 'responsesReasoningEffort' &&
1065
- t.configScreen.effortSelectHint,
1066
- currentField === 'profile' &&
1067
- t.configScreen.profileSelectHint,
1068
- currentField === 'requestMethod' &&
1069
- t.configScreen.requestMethodSelectHint)))) : (React.createElement(Box, { flexDirection: "column" }, (() => {
1070
- // Calculate visible window
1071
- if (allFields.length <= MAX_VISIBLE_FIELDS) {
1072
- // Show all fields if less than max
1073
- return allFields.map(field => renderField(field));
1074
- }
1075
- // Calculate scroll window
1076
- const halfWindow = Math.floor(MAX_VISIBLE_FIELDS / 2);
1077
- let startIndex = Math.max(0, currentFieldIndex - halfWindow);
1078
- let endIndex = Math.min(allFields.length, startIndex + MAX_VISIBLE_FIELDS);
1079
- // Adjust if we're near the end
1080
- if (endIndex - startIndex < MAX_VISIBLE_FIELDS) {
1081
- startIndex = Math.max(0, endIndex - MAX_VISIBLE_FIELDS);
1082
- }
1083
- const visibleFields = allFields.slice(startIndex, endIndex);
1084
- return visibleFields.map(field => renderField(field));
1085
- })())),
1086
- errors.length > 0 && (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
1087
- React.createElement(Text, { color: theme.colors.error, bold: true }, t.configScreen.errors),
1088
- errors.map((error, index) => (React.createElement(Text, { key: index, color: theme.colors.error },
1089
- "\u2022 ",
1090
- error))))),
1091
- !(isEditing &&
1092
- (currentField === 'profile' ||
1093
- currentField === 'requestMethod' ||
1094
- currentField === 'advancedModel' ||
1095
- currentField === 'basicModel' ||
1096
- currentField === 'compactModelName' ||
1097
- currentField === 'responsesReasoningEffort')) && (React.createElement(Box, { flexDirection: "column", marginTop: 1 }, isEditing ? (React.createElement(Alert, { variant: "info" }, currentField === 'maxContextTokens' ||
1098
- currentField === 'maxTokens'
1099
- ? t.configScreen.editingHintNumeric
1100
- : t.configScreen.editingHintGeneral)) : (React.createElement(Alert, { variant: "info" }, t.configScreen.navigationHint))))));
1101
- }