@gguf/coder 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/package.json +5 -2
  2. package/.editorconfig +0 -16
  3. package/.env.example +0 -63
  4. package/.gitattributes +0 -1
  5. package/.semgrepignore +0 -19
  6. package/coder-dummy-file.ts +0 -52
  7. package/coder.config.example.json +0 -59
  8. package/coder.config.json +0 -13
  9. package/color_picker.html +0 -36
  10. package/scripts/extract-changelog.js +0 -73
  11. package/scripts/fetch-models.js +0 -143
  12. package/scripts/test.sh +0 -40
  13. package/scripts/update-homebrew-formula.sh +0 -125
  14. package/scripts/update-nix-version.sh +0 -157
  15. package/source/ai-sdk-client/AISDKClient.spec.ts +0 -117
  16. package/source/ai-sdk-client/AISDKClient.ts +0 -155
  17. package/source/ai-sdk-client/chat/chat-handler.spec.ts +0 -121
  18. package/source/ai-sdk-client/chat/chat-handler.ts +0 -276
  19. package/source/ai-sdk-client/chat/streaming-handler.spec.ts +0 -173
  20. package/source/ai-sdk-client/chat/streaming-handler.ts +0 -110
  21. package/source/ai-sdk-client/chat/tool-processor.spec.ts +0 -92
  22. package/source/ai-sdk-client/chat/tool-processor.ts +0 -70
  23. package/source/ai-sdk-client/converters/message-converter.spec.ts +0 -220
  24. package/source/ai-sdk-client/converters/message-converter.ts +0 -113
  25. package/source/ai-sdk-client/converters/tool-converter.spec.ts +0 -90
  26. package/source/ai-sdk-client/converters/tool-converter.ts +0 -46
  27. package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +0 -55
  28. package/source/ai-sdk-client/error-handling/error-extractor.ts +0 -15
  29. package/source/ai-sdk-client/error-handling/error-parser.spec.ts +0 -169
  30. package/source/ai-sdk-client/error-handling/error-parser.ts +0 -161
  31. package/source/ai-sdk-client/index.ts +0 -7
  32. package/source/ai-sdk-client/providers/provider-factory.spec.ts +0 -71
  33. package/source/ai-sdk-client/providers/provider-factory.ts +0 -41
  34. package/source/ai-sdk-client/types.ts +0 -9
  35. package/source/ai-sdk-client-empty-message.spec.ts +0 -141
  36. package/source/ai-sdk-client-error-handling.spec.ts +0 -186
  37. package/source/ai-sdk-client-maxretries.spec.ts +0 -114
  38. package/source/ai-sdk-client-preparestep.spec.ts +0 -279
  39. package/source/app/App.spec.tsx +0 -32
  40. package/source/app/App.tsx +0 -480
  41. package/source/app/components/AppContainer.spec.tsx +0 -96
  42. package/source/app/components/AppContainer.tsx +0 -56
  43. package/source/app/components/ChatInterface.spec.tsx +0 -163
  44. package/source/app/components/ChatInterface.tsx +0 -144
  45. package/source/app/components/ModalSelectors.spec.tsx +0 -141
  46. package/source/app/components/ModalSelectors.tsx +0 -135
  47. package/source/app/helpers.spec.ts +0 -97
  48. package/source/app/helpers.ts +0 -63
  49. package/source/app/index.ts +0 -4
  50. package/source/app/types.ts +0 -39
  51. package/source/app/utils/appUtils.ts +0 -294
  52. package/source/app/utils/conversationState.ts +0 -310
  53. package/source/app.spec.tsx +0 -244
  54. package/source/cli.spec.ts +0 -73
  55. package/source/cli.tsx +0 -51
  56. package/source/client-factory.spec.ts +0 -48
  57. package/source/client-factory.ts +0 -178
  58. package/source/command-parser.spec.ts +0 -127
  59. package/source/command-parser.ts +0 -36
  60. package/source/commands/checkpoint.spec.tsx +0 -277
  61. package/source/commands/checkpoint.tsx +0 -366
  62. package/source/commands/clear.tsx +0 -22
  63. package/source/commands/custom-commands.tsx +0 -121
  64. package/source/commands/exit.ts +0 -21
  65. package/source/commands/export.spec.tsx +0 -131
  66. package/source/commands/export.tsx +0 -79
  67. package/source/commands/help.tsx +0 -120
  68. package/source/commands/index.ts +0 -17
  69. package/source/commands/init.tsx +0 -339
  70. package/source/commands/lsp-command.spec.tsx +0 -281
  71. package/source/commands/lsp.tsx +0 -120
  72. package/source/commands/mcp-command.spec.tsx +0 -313
  73. package/source/commands/mcp.tsx +0 -162
  74. package/source/commands/model-database.spec.tsx +0 -758
  75. package/source/commands/model-database.tsx +0 -418
  76. package/source/commands/model.ts +0 -12
  77. package/source/commands/provider.ts +0 -12
  78. package/source/commands/setup-config.tsx +0 -16
  79. package/source/commands/simple-commands.spec.tsx +0 -175
  80. package/source/commands/status.ts +0 -12
  81. package/source/commands/theme.ts +0 -12
  82. package/source/commands/update.spec.tsx +0 -261
  83. package/source/commands/update.tsx +0 -201
  84. package/source/commands/usage.spec.tsx +0 -495
  85. package/source/commands/usage.tsx +0 -100
  86. package/source/commands.spec.ts +0 -436
  87. package/source/commands.ts +0 -83
  88. package/source/components/assistant-message.spec.tsx +0 -796
  89. package/source/components/assistant-message.tsx +0 -34
  90. package/source/components/bash-execution-indicator.tsx +0 -21
  91. package/source/components/cancelling-indicator.tsx +0 -16
  92. package/source/components/chat-queue.spec.tsx +0 -83
  93. package/source/components/chat-queue.tsx +0 -36
  94. package/source/components/checkpoint-display.spec.tsx +0 -219
  95. package/source/components/checkpoint-display.tsx +0 -126
  96. package/source/components/checkpoint-selector.spec.tsx +0 -173
  97. package/source/components/checkpoint-selector.tsx +0 -173
  98. package/source/components/development-mode-indicator.spec.tsx +0 -268
  99. package/source/components/development-mode-indicator.tsx +0 -38
  100. package/source/components/message-box.spec.tsx +0 -427
  101. package/source/components/message-box.tsx +0 -87
  102. package/source/components/model-selector.tsx +0 -132
  103. package/source/components/provider-selector.tsx +0 -75
  104. package/source/components/random-spinner.tsx +0 -19
  105. package/source/components/security-disclaimer.tsx +0 -73
  106. package/source/components/status-connection-display.spec.tsx +0 -133
  107. package/source/components/status.tsx +0 -267
  108. package/source/components/theme-selector.tsx +0 -126
  109. package/source/components/tool-confirmation.tsx +0 -190
  110. package/source/components/tool-execution-indicator.tsx +0 -33
  111. package/source/components/tool-message.tsx +0 -85
  112. package/source/components/ui/titled-box.spec.tsx +0 -207
  113. package/source/components/ui/titled-box.tsx +0 -57
  114. package/source/components/usage/progress-bar.spec.tsx +0 -398
  115. package/source/components/usage/progress-bar.tsx +0 -30
  116. package/source/components/usage/usage-display.spec.tsx +0 -780
  117. package/source/components/usage/usage-display.tsx +0 -291
  118. package/source/components/user-input.spec.tsx +0 -327
  119. package/source/components/user-input.tsx +0 -533
  120. package/source/components/user-message.spec.tsx +0 -230
  121. package/source/components/user-message.tsx +0 -84
  122. package/source/components/welcome-message.tsx +0 -76
  123. package/source/config/env-substitution.ts +0 -65
  124. package/source/config/index.spec.ts +0 -171
  125. package/source/config/index.ts +0 -154
  126. package/source/config/paths.spec.ts +0 -241
  127. package/source/config/paths.ts +0 -55
  128. package/source/config/preferences.ts +0 -51
  129. package/source/config/themes.ts +0 -315
  130. package/source/constants.ts +0 -130
  131. package/source/context/mode-context.spec.ts +0 -79
  132. package/source/context/mode-context.ts +0 -24
  133. package/source/custom-commands/executor.spec.ts +0 -142
  134. package/source/custom-commands/executor.ts +0 -64
  135. package/source/custom-commands/loader.spec.ts +0 -314
  136. package/source/custom-commands/loader.ts +0 -153
  137. package/source/custom-commands/parser.ts +0 -196
  138. package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +0 -39
  139. package/source/hooks/chat-handler/conversation/conversation-loop.tsx +0 -511
  140. package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +0 -50
  141. package/source/hooks/chat-handler/conversation/tool-executor.tsx +0 -109
  142. package/source/hooks/chat-handler/index.ts +0 -12
  143. package/source/hooks/chat-handler/state/streaming-state.spec.ts +0 -26
  144. package/source/hooks/chat-handler/state/streaming-state.ts +0 -19
  145. package/source/hooks/chat-handler/types.ts +0 -38
  146. package/source/hooks/chat-handler/useChatHandler.spec.tsx +0 -321
  147. package/source/hooks/chat-handler/useChatHandler.tsx +0 -194
  148. package/source/hooks/chat-handler/utils/context-checker.spec.ts +0 -60
  149. package/source/hooks/chat-handler/utils/context-checker.tsx +0 -73
  150. package/source/hooks/chat-handler/utils/message-helpers.spec.ts +0 -42
  151. package/source/hooks/chat-handler/utils/message-helpers.tsx +0 -36
  152. package/source/hooks/chat-handler/utils/tool-filters.spec.ts +0 -109
  153. package/source/hooks/chat-handler/utils/tool-filters.ts +0 -64
  154. package/source/hooks/useAppHandlers.tsx +0 -291
  155. package/source/hooks/useAppInitialization.tsx +0 -422
  156. package/source/hooks/useAppState.tsx +0 -311
  157. package/source/hooks/useDirectoryTrust.tsx +0 -98
  158. package/source/hooks/useInputState.ts +0 -414
  159. package/source/hooks/useModeHandlers.tsx +0 -302
  160. package/source/hooks/useNonInteractiveMode.ts +0 -140
  161. package/source/hooks/useTerminalWidth.tsx +0 -81
  162. package/source/hooks/useTheme.ts +0 -18
  163. package/source/hooks/useToolHandler.tsx +0 -349
  164. package/source/hooks/useUIState.ts +0 -61
  165. package/source/init/agents-template-generator.ts +0 -421
  166. package/source/init/existing-rules-extractor.ts +0 -319
  167. package/source/init/file-scanner.spec.ts +0 -227
  168. package/source/init/file-scanner.ts +0 -238
  169. package/source/init/framework-detector.ts +0 -382
  170. package/source/init/language-detector.ts +0 -269
  171. package/source/init/project-analyzer.spec.ts +0 -231
  172. package/source/init/project-analyzer.ts +0 -458
  173. package/source/lsp/index.ts +0 -31
  174. package/source/lsp/lsp-client.spec.ts +0 -508
  175. package/source/lsp/lsp-client.ts +0 -487
  176. package/source/lsp/lsp-manager.spec.ts +0 -477
  177. package/source/lsp/lsp-manager.ts +0 -419
  178. package/source/lsp/protocol.spec.ts +0 -502
  179. package/source/lsp/protocol.ts +0 -360
  180. package/source/lsp/server-discovery.spec.ts +0 -654
  181. package/source/lsp/server-discovery.ts +0 -515
  182. package/source/markdown-parser/html-entities.spec.ts +0 -88
  183. package/source/markdown-parser/html-entities.ts +0 -45
  184. package/source/markdown-parser/index.spec.ts +0 -281
  185. package/source/markdown-parser/index.ts +0 -126
  186. package/source/markdown-parser/table-parser.spec.ts +0 -133
  187. package/source/markdown-parser/table-parser.ts +0 -114
  188. package/source/markdown-parser/utils.spec.ts +0 -70
  189. package/source/markdown-parser/utils.ts +0 -13
  190. package/source/mcp/mcp-client.spec.ts +0 -81
  191. package/source/mcp/mcp-client.ts +0 -625
  192. package/source/mcp/transport-factory.spec.ts +0 -406
  193. package/source/mcp/transport-factory.ts +0 -312
  194. package/source/message-handler.ts +0 -67
  195. package/source/model-database/database-engine.spec.ts +0 -494
  196. package/source/model-database/database-engine.ts +0 -50
  197. package/source/model-database/model-database.spec.ts +0 -363
  198. package/source/model-database/model-database.ts +0 -91
  199. package/source/model-database/model-engine.spec.ts +0 -447
  200. package/source/model-database/model-engine.ts +0 -65
  201. package/source/model-database/model-fetcher.spec.ts +0 -583
  202. package/source/model-database/model-fetcher.ts +0 -330
  203. package/source/models/index.ts +0 -1
  204. package/source/models/models-cache.spec.ts +0 -214
  205. package/source/models/models-cache.ts +0 -78
  206. package/source/models/models-dev-client.spec.ts +0 -379
  207. package/source/models/models-dev-client.ts +0 -329
  208. package/source/models/models-types.ts +0 -68
  209. package/source/prompt-history.ts +0 -155
  210. package/source/security/command-injection.spec.ts +0 -240
  211. package/source/services/checkpoint-manager.spec.ts +0 -523
  212. package/source/services/checkpoint-manager.ts +0 -466
  213. package/source/services/file-snapshot.spec.ts +0 -569
  214. package/source/services/file-snapshot.ts +0 -220
  215. package/source/test-utils/render-with-theme.tsx +0 -48
  216. package/source/tokenization/index.ts +0 -1
  217. package/source/tokenization/tokenizer-factory.spec.ts +0 -170
  218. package/source/tokenization/tokenizer-factory.ts +0 -125
  219. package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +0 -200
  220. package/source/tokenization/tokenizers/anthropic-tokenizer.ts +0 -43
  221. package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +0 -236
  222. package/source/tokenization/tokenizers/fallback-tokenizer.ts +0 -26
  223. package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +0 -224
  224. package/source/tokenization/tokenizers/llama-tokenizer.ts +0 -41
  225. package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +0 -184
  226. package/source/tokenization/tokenizers/openai-tokenizer.ts +0 -57
  227. package/source/tool-calling/index.ts +0 -5
  228. package/source/tool-calling/json-parser.spec.ts +0 -639
  229. package/source/tool-calling/json-parser.ts +0 -247
  230. package/source/tool-calling/tool-parser.spec.ts +0 -395
  231. package/source/tool-calling/tool-parser.ts +0 -120
  232. package/source/tool-calling/xml-parser.spec.ts +0 -662
  233. package/source/tool-calling/xml-parser.ts +0 -289
  234. package/source/tools/execute-bash.spec.tsx +0 -353
  235. package/source/tools/execute-bash.tsx +0 -219
  236. package/source/tools/execute-function.spec.ts +0 -130
  237. package/source/tools/fetch-url.spec.tsx +0 -342
  238. package/source/tools/fetch-url.tsx +0 -172
  239. package/source/tools/find-files.spec.tsx +0 -924
  240. package/source/tools/find-files.tsx +0 -293
  241. package/source/tools/index.ts +0 -102
  242. package/source/tools/lsp-get-diagnostics.tsx +0 -192
  243. package/source/tools/needs-approval.spec.ts +0 -282
  244. package/source/tools/read-file.spec.tsx +0 -801
  245. package/source/tools/read-file.tsx +0 -387
  246. package/source/tools/search-file-contents.spec.tsx +0 -1273
  247. package/source/tools/search-file-contents.tsx +0 -293
  248. package/source/tools/string-replace.spec.tsx +0 -730
  249. package/source/tools/string-replace.tsx +0 -548
  250. package/source/tools/tool-manager.ts +0 -210
  251. package/source/tools/tool-registry.spec.ts +0 -415
  252. package/source/tools/tool-registry.ts +0 -228
  253. package/source/tools/web-search.tsx +0 -223
  254. package/source/tools/write-file.spec.tsx +0 -559
  255. package/source/tools/write-file.tsx +0 -228
  256. package/source/types/app.ts +0 -37
  257. package/source/types/checkpoint.ts +0 -48
  258. package/source/types/commands.ts +0 -46
  259. package/source/types/components.ts +0 -27
  260. package/source/types/config.ts +0 -103
  261. package/source/types/core-connection-status.spec.ts +0 -67
  262. package/source/types/core.ts +0 -181
  263. package/source/types/hooks.ts +0 -50
  264. package/source/types/index.ts +0 -12
  265. package/source/types/markdown-parser.ts +0 -11
  266. package/source/types/mcp.ts +0 -52
  267. package/source/types/system.ts +0 -16
  268. package/source/types/tokenization.ts +0 -41
  269. package/source/types/ui.ts +0 -40
  270. package/source/types/usage.ts +0 -58
  271. package/source/types/utils.ts +0 -16
  272. package/source/usage/calculator.spec.ts +0 -385
  273. package/source/usage/calculator.ts +0 -104
  274. package/source/usage/storage.spec.ts +0 -703
  275. package/source/usage/storage.ts +0 -238
  276. package/source/usage/tracker.spec.ts +0 -456
  277. package/source/usage/tracker.ts +0 -102
  278. package/source/utils/atomic-deletion.spec.ts +0 -194
  279. package/source/utils/atomic-deletion.ts +0 -127
  280. package/source/utils/bounded-map.spec.ts +0 -300
  281. package/source/utils/bounded-map.ts +0 -193
  282. package/source/utils/checkpoint-utils.spec.ts +0 -222
  283. package/source/utils/checkpoint-utils.ts +0 -92
  284. package/source/utils/error-formatter.spec.ts +0 -169
  285. package/source/utils/error-formatter.ts +0 -194
  286. package/source/utils/file-autocomplete.spec.ts +0 -173
  287. package/source/utils/file-autocomplete.ts +0 -196
  288. package/source/utils/file-cache.spec.ts +0 -309
  289. package/source/utils/file-cache.ts +0 -195
  290. package/source/utils/file-content-loader.spec.ts +0 -180
  291. package/source/utils/file-content-loader.ts +0 -179
  292. package/source/utils/file-mention-handler.spec.ts +0 -261
  293. package/source/utils/file-mention-handler.ts +0 -84
  294. package/source/utils/file-mention-parser.spec.ts +0 -182
  295. package/source/utils/file-mention-parser.ts +0 -170
  296. package/source/utils/fuzzy-matching.spec.ts +0 -149
  297. package/source/utils/fuzzy-matching.ts +0 -146
  298. package/source/utils/indentation-normalizer.spec.ts +0 -216
  299. package/source/utils/indentation-normalizer.ts +0 -76
  300. package/source/utils/installation-detector.spec.ts +0 -178
  301. package/source/utils/installation-detector.ts +0 -153
  302. package/source/utils/logging/config.spec.ts +0 -311
  303. package/source/utils/logging/config.ts +0 -210
  304. package/source/utils/logging/console-facade.spec.ts +0 -184
  305. package/source/utils/logging/console-facade.ts +0 -384
  306. package/source/utils/logging/correlation.spec.ts +0 -679
  307. package/source/utils/logging/correlation.ts +0 -474
  308. package/source/utils/logging/formatters.spec.ts +0 -464
  309. package/source/utils/logging/formatters.ts +0 -207
  310. package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +0 -93
  311. package/source/utils/logging/health-monitor/alerts/alert-manager.ts +0 -79
  312. package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +0 -56
  313. package/source/utils/logging/health-monitor/checks/configuration-check.ts +0 -43
  314. package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +0 -56
  315. package/source/utils/logging/health-monitor/checks/logging-check.ts +0 -58
  316. package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +0 -100
  317. package/source/utils/logging/health-monitor/checks/memory-check.ts +0 -78
  318. package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +0 -56
  319. package/source/utils/logging/health-monitor/checks/performance-check.ts +0 -56
  320. package/source/utils/logging/health-monitor/checks/request-check.spec.ts +0 -56
  321. package/source/utils/logging/health-monitor/checks/request-check.ts +0 -76
  322. package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +0 -70
  323. package/source/utils/logging/health-monitor/core/health-check-runner.ts +0 -138
  324. package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +0 -58
  325. package/source/utils/logging/health-monitor/core/health-monitor.ts +0 -344
  326. package/source/utils/logging/health-monitor/core/scoring.spec.ts +0 -65
  327. package/source/utils/logging/health-monitor/core/scoring.ts +0 -91
  328. package/source/utils/logging/health-monitor/index.ts +0 -15
  329. package/source/utils/logging/health-monitor/instances.ts +0 -48
  330. package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +0 -141
  331. package/source/utils/logging/health-monitor/middleware/http-middleware.ts +0 -75
  332. package/source/utils/logging/health-monitor/types.ts +0 -126
  333. package/source/utils/logging/index.spec.ts +0 -284
  334. package/source/utils/logging/index.ts +0 -236
  335. package/source/utils/logging/integration.spec.ts +0 -441
  336. package/source/utils/logging/log-method-factory.spec.ts +0 -573
  337. package/source/utils/logging/log-method-factory.ts +0 -233
  338. package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +0 -277
  339. package/source/utils/logging/log-query/aggregation/aggregator.ts +0 -159
  340. package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +0 -159
  341. package/source/utils/logging/log-query/aggregation/facet-generator.ts +0 -47
  342. package/source/utils/logging/log-query/index.ts +0 -23
  343. package/source/utils/logging/log-query/query/filter-predicates.spec.ts +0 -247
  344. package/source/utils/logging/log-query/query/filter-predicates.ts +0 -154
  345. package/source/utils/logging/log-query/query/query-builder.spec.ts +0 -182
  346. package/source/utils/logging/log-query/query/query-builder.ts +0 -151
  347. package/source/utils/logging/log-query/query/query-engine.spec.ts +0 -214
  348. package/source/utils/logging/log-query/query/query-engine.ts +0 -45
  349. package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +0 -143
  350. package/source/utils/logging/log-query/storage/circular-buffer.ts +0 -75
  351. package/source/utils/logging/log-query/storage/index-manager.spec.ts +0 -150
  352. package/source/utils/logging/log-query/storage/index-manager.ts +0 -71
  353. package/source/utils/logging/log-query/storage/log-storage.spec.ts +0 -257
  354. package/source/utils/logging/log-query/storage/log-storage.ts +0 -80
  355. package/source/utils/logging/log-query/types.ts +0 -163
  356. package/source/utils/logging/log-query/utils/helpers.spec.ts +0 -263
  357. package/source/utils/logging/log-query/utils/helpers.ts +0 -72
  358. package/source/utils/logging/log-query/utils/sorting.spec.ts +0 -182
  359. package/source/utils/logging/log-query/utils/sorting.ts +0 -61
  360. package/source/utils/logging/logger-provider.spec.ts +0 -262
  361. package/source/utils/logging/logger-provider.ts +0 -362
  362. package/source/utils/logging/performance.spec.ts +0 -209
  363. package/source/utils/logging/performance.ts +0 -757
  364. package/source/utils/logging/pino-logger.spec.ts +0 -425
  365. package/source/utils/logging/pino-logger.ts +0 -514
  366. package/source/utils/logging/redaction.spec.ts +0 -490
  367. package/source/utils/logging/redaction.ts +0 -267
  368. package/source/utils/logging/request-tracker.spec.ts +0 -1198
  369. package/source/utils/logging/request-tracker.ts +0 -803
  370. package/source/utils/logging/transports.spec.ts +0 -505
  371. package/source/utils/logging/transports.ts +0 -305
  372. package/source/utils/logging/types.ts +0 -216
  373. package/source/utils/message-builder.spec.ts +0 -179
  374. package/source/utils/message-builder.ts +0 -101
  375. package/source/utils/message-queue.tsx +0 -486
  376. package/source/utils/paste-detection.spec.ts +0 -69
  377. package/source/utils/paste-detection.ts +0 -124
  378. package/source/utils/paste-roundtrip.spec.ts +0 -442
  379. package/source/utils/paste-utils.spec.ts +0 -128
  380. package/source/utils/paste-utils.ts +0 -52
  381. package/source/utils/programming-language-helper.spec.ts +0 -74
  382. package/source/utils/programming-language-helper.ts +0 -32
  383. package/source/utils/prompt-assembly.spec.ts +0 -221
  384. package/source/utils/prompt-processor.ts +0 -173
  385. package/source/utils/tool-args-parser.spec.ts +0 -136
  386. package/source/utils/tool-args-parser.ts +0 -54
  387. package/source/utils/tool-cancellation.spec.ts +0 -230
  388. package/source/utils/tool-cancellation.ts +0 -28
  389. package/source/utils/tool-result-display.spec.tsx +0 -469
  390. package/source/utils/tool-result-display.tsx +0 -90
  391. package/source/utils/update-checker.spec.ts +0 -383
  392. package/source/utils/update-checker.ts +0 -183
  393. package/source/wizard/config-wizard.spec.tsx +0 -103
  394. package/source/wizard/config-wizard.tsx +0 -382
  395. package/source/wizard/steps/location-step.spec.tsx +0 -186
  396. package/source/wizard/steps/location-step.tsx +0 -147
  397. package/source/wizard/steps/mcp-step.spec.tsx +0 -607
  398. package/source/wizard/steps/mcp-step.tsx +0 -632
  399. package/source/wizard/steps/provider-step.spec.tsx +0 -342
  400. package/source/wizard/steps/provider-step.tsx +0 -957
  401. package/source/wizard/steps/summary-step.spec.tsx +0 -749
  402. package/source/wizard/steps/summary-step.tsx +0 -228
  403. package/source/wizard/templates/mcp-templates.spec.ts +0 -613
  404. package/source/wizard/templates/mcp-templates.ts +0 -570
  405. package/source/wizard/templates/provider-templates.spec.ts +0 -152
  406. package/source/wizard/templates/provider-templates.ts +0 -485
  407. package/source/wizard/utils/fetch-cloud-models.spec.ts +0 -428
  408. package/source/wizard/utils/fetch-cloud-models.ts +0 -223
  409. package/source/wizard/utils/fetch-local-models.spec.ts +0 -297
  410. package/source/wizard/utils/fetch-local-models.ts +0 -192
  411. package/source/wizard/validation-array.spec.ts +0 -264
  412. package/source/wizard/validation.spec.ts +0 -373
  413. package/source/wizard/validation.ts +0 -232
@@ -1,414 +0,0 @@
1
- import {
2
- PASTE_CHUNK_BASE_WINDOW_MS,
3
- PASTE_CHUNK_MAX_WINDOW_MS,
4
- PASTE_LARGE_CONTENT_THRESHOLD_CHARS,
5
- PASTE_RAPID_DETECTION_MS,
6
- } from '@/constants';
7
- import {useCallback, useEffect, useMemo, useRef, useState} from 'react';
8
- import {InputState, PlaceholderType} from '../types/hooks';
9
- import {handleAtomicDeletion} from '../utils/atomic-deletion';
10
- import {PasteDetector} from '../utils/paste-detection';
11
- import {handlePaste} from '../utils/paste-utils';
12
-
13
- // Scales the paste window size based on content length.
14
- // Prevents truncation on slow terminals while keeping small pastes snappy
15
- function getDynamicPasteWindow(contentLength: number): number {
16
- // Add ~1ms buffer per 10 chars, capped at max window
17
- const dynamicExtension = Math.floor(contentLength / 10);
18
- return Math.min(
19
- PASTE_CHUNK_BASE_WINDOW_MS + dynamicExtension,
20
- PASTE_CHUNK_MAX_WINDOW_MS,
21
- );
22
- }
23
-
24
- // Helper functions
25
- function createEmptyInputState(): InputState {
26
- return {
27
- displayValue: '',
28
- placeholderContent: {},
29
- };
30
- }
31
-
32
- export function useInputState() {
33
- // Core state following the spec
34
- const [currentState, setCurrentState] = useState<InputState>(
35
- createEmptyInputState(),
36
- );
37
-
38
- const [undoStack, setUndoStack] = useState<InputState[]>([]);
39
- const [redoStack, setRedoStack] = useState<InputState[]>([]);
40
-
41
- // Legacy compatibility - these are derived from currentState
42
- const [historyIndex, setHistoryIndex] = useState(-1);
43
- const [_hasLargeContent, setHasLargeContent] = useState(false);
44
- const [originalInput, setOriginalInput] = useState('');
45
-
46
- // Paste detection
47
- const pasteDetectorRef = useRef(new PasteDetector());
48
- const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);
49
-
50
- // Track recent paste for chunked paste handling (VS Code terminal issue)
51
- const lastPasteTimeRef = useRef<number>(0);
52
- const lastPasteIdRef = useRef<string | null>(null);
53
-
54
- // Cached line count for performance
55
- const [cachedLineCount, setCachedLineCount] = useState(1);
56
-
57
- // Helper to push current state to undo stack
58
- const pushToUndoStack = useCallback(
59
- (newState: InputState) => {
60
- setUndoStack(prev => [...prev, currentState]);
61
- setRedoStack([]); // Clear redo stack on new action
62
- setCurrentState(newState);
63
- },
64
- [currentState],
65
- );
66
-
67
- // Update input with paste detection and atomic deletion
68
- const updateInput = useCallback(
69
- (newInput: string) => {
70
- // First, check for atomic deletion (placeholder removal)
71
- const atomicDeletionResult = handleAtomicDeletion(currentState, newInput);
72
- if (atomicDeletionResult) {
73
- // Atomic deletion occurred - apply it
74
- pushToUndoStack(atomicDeletionResult);
75
- return;
76
- }
77
-
78
- const now = Date.now();
79
- const timeSinceLastPaste = now - lastPasteTimeRef.current;
80
-
81
- // Check if this might be a continuation of a recent paste (chunked paste in VS Code)
82
- const existingPlaceholder = lastPasteIdRef.current
83
- ? currentState.placeholderContent[lastPasteIdRef.current]
84
- : null;
85
- const dynamicWindow = existingPlaceholder
86
- ? getDynamicPasteWindow(existingPlaceholder.content.length)
87
- : PASTE_CHUNK_BASE_WINDOW_MS;
88
-
89
- if (
90
- lastPasteIdRef.current &&
91
- timeSinceLastPaste < dynamicWindow &&
92
- existingPlaceholder
93
- ) {
94
- // This looks like a chunked paste continuation
95
- // Extract the new text that was added (should be at the end)
96
- const placeholder =
97
- currentState.placeholderContent[lastPasteIdRef.current];
98
- const expectedLength = currentState.displayValue.length;
99
- const addedChunk = newInput.slice(expectedLength);
100
-
101
- if (
102
- addedChunk.length > 0 &&
103
- placeholder.type === PlaceholderType.PASTE
104
- ) {
105
- // Merge the new chunk into the existing paste placeholder
106
- const updatedContent = placeholder.content + addedChunk;
107
- const oldPlaceholder = placeholder.displayText;
108
- const newPlaceholder = `[Paste #${lastPasteIdRef.current}: ${updatedContent.length} chars]`;
109
-
110
- const updatedPlaceholderContent = {
111
- ...currentState.placeholderContent,
112
- [lastPasteIdRef.current]: {
113
- ...placeholder,
114
- content: updatedContent,
115
- originalSize: updatedContent.length,
116
- displayText: newPlaceholder,
117
- },
118
- };
119
-
120
- // Replace old placeholder with updated one in display value
121
- const newDisplayValue = currentState.displayValue.replace(
122
- oldPlaceholder,
123
- newPlaceholder,
124
- );
125
-
126
- pushToUndoStack({
127
- displayValue: newDisplayValue,
128
- placeholderContent: updatedPlaceholderContent,
129
- });
130
-
131
- // Update paste detector to the new display value
132
- pasteDetectorRef.current.updateState(newDisplayValue);
133
- lastPasteTimeRef.current = now; // Extend the window
134
- return;
135
- }
136
- }
137
-
138
- // Then detect if this might be a paste
139
- const detection = pasteDetectorRef.current.detectPaste(newInput);
140
-
141
- if (detection.isPaste && detection.addedText.length > 0) {
142
- // If we have an active paste within a short window (even if state hasn't fully updated),
143
- // treat this as a continuation to prevent duplicate placeholders
144
- const isVeryRecentPaste = timeSinceLastPaste < PASTE_RAPID_DETECTION_MS;
145
-
146
- const activePasteId = lastPasteIdRef.current;
147
- const activePlaceholder = activePasteId
148
- ? currentState.placeholderContent[activePasteId]
149
- : null;
150
- const activeWindow = activePlaceholder
151
- ? getDynamicPasteWindow(activePlaceholder.content.length)
152
- : PASTE_CHUNK_BASE_WINDOW_MS;
153
-
154
- if (
155
- activePasteId &&
156
- (isVeryRecentPaste ||
157
- (timeSinceLastPaste < activeWindow && activePlaceholder))
158
- ) {
159
- // If we don't have the placeholder in state yet, just update detector and skip
160
- // This happens when multiple detections fire before React updates state
161
- const placeholder = currentState.placeholderContent[activePasteId];
162
- if (!placeholder) {
163
- // Skip duplicate early detection
164
- pasteDetectorRef.current.updateState(newInput);
165
- return;
166
- }
167
-
168
- // Treat as chunked continuation
169
- if (placeholder.type === PlaceholderType.PASTE) {
170
- const updatedContent = placeholder.content + detection.addedText;
171
- const oldPlaceholder = placeholder.displayText;
172
- const newPlaceholder = `[Paste #${activePasteId}: ${updatedContent.length} chars]`;
173
-
174
- const updatedPlaceholderContent = {
175
- ...currentState.placeholderContent,
176
- [activePasteId]: {
177
- ...placeholder,
178
- content: updatedContent,
179
- originalSize: updatedContent.length,
180
- displayText: newPlaceholder,
181
- },
182
- };
183
-
184
- const newDisplayValue = currentState.displayValue.replace(
185
- oldPlaceholder,
186
- newPlaceholder,
187
- );
188
-
189
- pushToUndoStack({
190
- displayValue: newDisplayValue,
191
- placeholderContent: updatedPlaceholderContent,
192
- });
193
-
194
- pasteDetectorRef.current.updateState(newDisplayValue);
195
- lastPasteTimeRef.current = now;
196
- return;
197
- }
198
- }
199
-
200
- // Try to handle as paste (new paste)
201
- const pasteResult = handlePaste(
202
- detection.addedText,
203
- currentState.displayValue,
204
- currentState.placeholderContent,
205
- detection.method as 'rate' | 'size' | 'multiline',
206
- );
207
-
208
- if (pasteResult) {
209
- // Large paste detected - create placeholder
210
- pushToUndoStack(pasteResult);
211
- // Update paste detector state to match the new display value (with placeholder)
212
- // This prevents detection confusion on subsequent pastes
213
- pasteDetectorRef.current.updateState(pasteResult.displayValue);
214
-
215
- // Track this paste for potential chunked continuation
216
- const pasteId = Object.keys(pasteResult.placeholderContent).find(
217
- id =>
218
- !currentState.placeholderContent[id] &&
219
- pasteResult.placeholderContent[id].type === PlaceholderType.PASTE,
220
- );
221
- if (pasteId) {
222
- lastPasteIdRef.current = pasteId;
223
- lastPasteTimeRef.current = now;
224
- }
225
- } else {
226
- // Small paste - treat as normal input
227
- pushToUndoStack({
228
- displayValue: newInput,
229
- placeholderContent: currentState.placeholderContent,
230
- });
231
- }
232
- } else {
233
- // Normal typing
234
- pushToUndoStack({
235
- displayValue: newInput,
236
- placeholderContent: currentState.placeholderContent,
237
- });
238
- }
239
-
240
- // Update derived state
241
- const immediateLineCount = Math.max(
242
- 1,
243
- newInput.split(/\r\n|\r|\n/).length,
244
- );
245
- setCachedLineCount(immediateLineCount);
246
-
247
- // Clear any previous debounce timer
248
- if (debounceTimerRef.current) {
249
- clearTimeout(debounceTimerRef.current);
250
- }
251
-
252
- debounceTimerRef.current = setTimeout(() => {
253
- setHasLargeContent(
254
- newInput.length > PASTE_LARGE_CONTENT_THRESHOLD_CHARS,
255
- );
256
- }, 50);
257
- },
258
- [currentState, pushToUndoStack],
259
- );
260
-
261
- // Undo function (Ctrl+_)
262
- const undo = useCallback(() => {
263
- if (undoStack.length > 0) {
264
- const previousState = undoStack[undoStack.length - 1];
265
- const newUndoStack = undoStack.slice(0, -1);
266
-
267
- setRedoStack(prev => [...prev, currentState]);
268
- setUndoStack(newUndoStack);
269
- setCurrentState(previousState);
270
-
271
- // Update paste detector state
272
- pasteDetectorRef.current.updateState(previousState.displayValue);
273
- }
274
- }, [undoStack, currentState]);
275
-
276
- // Redo function (Ctrl+Y)
277
- const redo = useCallback(() => {
278
- if (redoStack.length > 0) {
279
- const nextState = redoStack[redoStack.length - 1];
280
- const newRedoStack = redoStack.slice(0, -1);
281
-
282
- setUndoStack(prev => [...prev, currentState]);
283
- setRedoStack(newRedoStack);
284
- setCurrentState(nextState);
285
-
286
- // Update paste detector state
287
- pasteDetectorRef.current.updateState(nextState.displayValue);
288
- }
289
- }, [redoStack, currentState]);
290
-
291
- // Delete placeholder atomically
292
- const deletePlaceholder = useCallback(
293
- (placeholderId: string) => {
294
- // Sanitize placeholderId to ensure it only contains safe characters
295
- const sanitizedPlaceholderId = placeholderId.replace(
296
- /[^a-zA-Z0-9_-]/g,
297
- '',
298
- );
299
- const placeholderPattern = `[Paste #${sanitizedPlaceholderId}: \\d+ chars]`;
300
- /* nosemgrep */
301
- const regex = new RegExp(
302
- placeholderPattern.replace(/[[\]]/g, '\\$&'),
303
- 'g',
304
- );
305
-
306
- const newDisplayValue = currentState.displayValue.replace(regex, '');
307
- const newPlaceholderContent = {...currentState.placeholderContent};
308
- delete newPlaceholderContent[placeholderId];
309
-
310
- pushToUndoStack({
311
- displayValue: newDisplayValue,
312
- placeholderContent: newPlaceholderContent,
313
- });
314
- },
315
- [currentState, pushToUndoStack],
316
- );
317
-
318
- // Reset all state
319
- const resetInput = useCallback(() => {
320
- if (debounceTimerRef.current) {
321
- clearTimeout(debounceTimerRef.current);
322
- debounceTimerRef.current = null;
323
- }
324
-
325
- setCurrentState(createEmptyInputState());
326
- setUndoStack([]);
327
- setRedoStack([]);
328
- setHasLargeContent(false);
329
- setOriginalInput('');
330
- setHistoryIndex(-1);
331
- setCachedLineCount(1);
332
- pasteDetectorRef.current.reset();
333
- lastPasteTimeRef.current = 0;
334
- lastPasteIdRef.current = null;
335
- }, []);
336
-
337
- // Cleanup on unmount
338
- useEffect(() => {
339
- return () => {
340
- if (debounceTimerRef.current) {
341
- clearTimeout(debounceTimerRef.current);
342
- debounceTimerRef.current = null;
343
- }
344
- };
345
- }, []);
346
-
347
- // Set full InputState (for history navigation)
348
- const setInputState = useCallback((newState: InputState) => {
349
- setCurrentState(newState);
350
- pasteDetectorRef.current.updateState(newState.displayValue);
351
- }, []);
352
-
353
- // Legacy setters for compatibility
354
- const setInput = useCallback((newInput: string) => {
355
- setCurrentState(prev => ({
356
- ...prev,
357
- displayValue: newInput,
358
- }));
359
- pasteDetectorRef.current.updateState(newInput);
360
- }, []);
361
-
362
- // Compute legacy pastedContent for backward compatibility
363
- const legacyPastedContent = useMemo(() => {
364
- const pastedContent: Record<string, string> = {};
365
- Object.entries(currentState.placeholderContent).forEach(([id, content]) => {
366
- if (content.type === PlaceholderType.PASTE) {
367
- pastedContent[id] = content.content;
368
- }
369
- });
370
- return pastedContent;
371
- }, [currentState.placeholderContent]);
372
-
373
- return useMemo(
374
- () => ({
375
- // New spec-compliant interface
376
- currentState,
377
- undoStack,
378
- redoStack,
379
- undo,
380
- redo,
381
- deletePlaceholder,
382
- setInputState,
383
-
384
- // Legacy interface for compatibility
385
- input: currentState.displayValue,
386
- originalInput,
387
- historyIndex,
388
- setInput,
389
- setOriginalInput,
390
- setHistoryIndex,
391
- updateInput,
392
- resetInput,
393
- cachedLineCount,
394
- // Computed legacy property for backward compatibility
395
- pastedContent: legacyPastedContent,
396
- }),
397
- [
398
- currentState,
399
- undoStack,
400
- redoStack,
401
- undo,
402
- redo,
403
- deletePlaceholder,
404
- setInputState,
405
- originalInput,
406
- historyIndex,
407
- setInput,
408
- updateInput,
409
- resetInput,
410
- cachedLineCount,
411
- legacyPastedContent,
412
- ],
413
- );
414
- }
@@ -1,302 +0,0 @@
1
- import { createLLMClient } from '@/client-factory';
2
- import { ErrorMessage, SuccessMessage } from '@/components/message-box';
3
- import { reloadAppConfig } from '@/config/index';
4
- import {
5
- loadPreferences,
6
- savePreferences,
7
- updateLastUsed,
8
- } from '@/config/preferences';
9
- import { getToolManager } from '@/message-handler';
10
- import { LLMClient, Message } from '@/types/core';
11
- import type { ThemePreset } from '@/types/ui';
12
- import React from 'react';
13
-
14
- interface UseModeHandlersProps {
15
- client: LLMClient | null;
16
- currentModel: string;
17
- currentProvider: string;
18
- currentTheme: ThemePreset;
19
- setClient: (client: LLMClient | null) => void;
20
- setCurrentModel: (model: string) => void;
21
- setCurrentProvider: (provider: string) => void;
22
- setCurrentTheme: (theme: ThemePreset) => void;
23
- setMessages: (messages: Message[]) => void;
24
- setIsModelSelectionMode: (mode: boolean) => void;
25
- setIsProviderSelectionMode: (mode: boolean) => void;
26
- setIsThemeSelectionMode: (mode: boolean) => void;
27
- setIsModelDatabaseMode: (mode: boolean) => void;
28
- setIsConfigWizardMode: (mode: boolean) => void;
29
- addToChatQueue: (component: React.ReactNode) => void;
30
- componentKeyCounter: number;
31
- reinitializeMCPServers: (
32
- toolManager: import('@/tools/tool-manager').ToolManager,
33
- ) => Promise<void>;
34
- }
35
-
36
- export function useModeHandlers({
37
- client,
38
- currentModel,
39
- currentProvider,
40
- currentTheme: _currentTheme,
41
- setClient,
42
- setCurrentModel,
43
- setCurrentProvider,
44
- setCurrentTheme,
45
- setMessages,
46
- setIsModelSelectionMode,
47
- setIsProviderSelectionMode,
48
- setIsThemeSelectionMode,
49
- setIsModelDatabaseMode,
50
- setIsConfigWizardMode,
51
- addToChatQueue,
52
- componentKeyCounter,
53
- reinitializeMCPServers,
54
- }: UseModeHandlersProps) {
55
- // Helper function to enter model selection mode
56
- const enterModelSelectionMode = () => {
57
- setIsModelSelectionMode(true);
58
- };
59
-
60
- // Helper function to enter provider selection mode
61
- const enterProviderSelectionMode = () => {
62
- setIsProviderSelectionMode(true);
63
- };
64
-
65
- // Handle model selection
66
- const handleModelSelect = async (selectedModel: string) => {
67
- if (client && selectedModel !== currentModel) {
68
- client.setModel(selectedModel);
69
- setCurrentModel(selectedModel);
70
-
71
- // Clear message history when switching models
72
- setMessages([]);
73
- await client.clearContext();
74
-
75
- // Update preferences
76
- updateLastUsed(currentProvider, selectedModel);
77
-
78
- // Add success message to chat queue
79
- addToChatQueue(
80
- <SuccessMessage
81
- key={`model-changed-${componentKeyCounter}`}
82
- message={`Model changed to: ${selectedModel}. Chat history cleared.`}
83
- hideBox={true}
84
- />,
85
- );
86
- }
87
- setIsModelSelectionMode(false);
88
- };
89
-
90
- // Handle model selection cancel
91
- const handleModelSelectionCancel = () => {
92
- setIsModelSelectionMode(false);
93
- };
94
-
95
- // Handle provider selection
96
- const handleProviderSelect = async (selectedProvider: string) => {
97
- if (selectedProvider !== currentProvider) {
98
- try {
99
- // Create new client for the selected provider
100
- const { client: newClient, actualProvider } =
101
- await createLLMClient(selectedProvider);
102
-
103
- // Check if we got the provider we requested
104
- if (actualProvider !== selectedProvider) {
105
- // Provider was forced to a different one (likely due to missing config)
106
- addToChatQueue(
107
- <ErrorMessage
108
- key={`provider-forced-${componentKeyCounter}`}
109
- message={`${selectedProvider} is not available. Please ensure it's properly configured in coder.config.json.`}
110
- hideBox={true}
111
- />,
112
- );
113
- return; // Don't change anything
114
- }
115
-
116
- setClient(newClient);
117
- setCurrentProvider(actualProvider);
118
-
119
- // Set the model from the new client
120
- const newModel = newClient.getCurrentModel();
121
- setCurrentModel(newModel);
122
-
123
- // Clear message history when switching providers
124
- setMessages([]);
125
- await newClient.clearContext();
126
-
127
- // Update preferences - use the actualProvider (which is what was successfully created)
128
- updateLastUsed(actualProvider, newModel);
129
-
130
- // Add success message to chat queue
131
- addToChatQueue(
132
- <SuccessMessage
133
- key={`provider-changed-${componentKeyCounter}`}
134
- message={`Provider changed to: ${actualProvider}, model: ${newModel}. Chat history cleared.`}
135
- hideBox={true}
136
- />,
137
- );
138
- } catch (error) {
139
- // Add error message if provider change fails
140
- addToChatQueue(
141
- <ErrorMessage
142
- key={`provider-error-${componentKeyCounter}`}
143
- message={`Failed to change provider to ${selectedProvider}: ${String(
144
- error,
145
- )}`}
146
- hideBox={true}
147
- />,
148
- );
149
- }
150
- }
151
- setIsProviderSelectionMode(false);
152
- };
153
-
154
- // Handle provider selection cancel
155
- const handleProviderSelectionCancel = () => {
156
- setIsProviderSelectionMode(false);
157
- };
158
-
159
- // Helper function to enter theme selection mode
160
- const enterThemeSelectionMode = () => {
161
- setIsThemeSelectionMode(true);
162
- };
163
-
164
- // Handle theme selection
165
- const handleThemeSelect = (selectedTheme: ThemePreset) => {
166
- const preferences = loadPreferences();
167
- preferences.selectedTheme = selectedTheme;
168
- savePreferences(preferences);
169
-
170
- // Update the theme state immediately for real-time switching
171
- setCurrentTheme(selectedTheme);
172
-
173
- // Add success message to chat queue
174
- addToChatQueue(
175
- <SuccessMessage
176
- key={`theme-changed-${componentKeyCounter}`}
177
- message={`Theme changed to: ${selectedTheme}.`}
178
- hideBox={true}
179
- />,
180
- );
181
-
182
- setIsThemeSelectionMode(false);
183
- };
184
-
185
- // Handle theme selection cancel
186
- const handleThemeSelectionCancel = () => {
187
- setIsThemeSelectionMode(false);
188
- };
189
-
190
- // Helper function to enter model database mode
191
- const enterModelDatabaseMode = () => {
192
- setIsModelDatabaseMode(true);
193
- };
194
-
195
- // Handle model database cancel
196
- const handleModelDatabaseCancel = () => {
197
- setIsModelDatabaseMode(false);
198
- };
199
-
200
- // Helper function to enter config wizard mode
201
- const enterConfigWizardMode = () => {
202
- setIsConfigWizardMode(true);
203
- };
204
-
205
- // Handle config wizard cancel/complete
206
- const handleConfigWizardComplete = async (configPath?: string) => {
207
- setIsConfigWizardMode(false);
208
- if (configPath) {
209
- addToChatQueue(
210
- <SuccessMessage
211
- key={`config-wizard-complete-${componentKeyCounter}`}
212
- message={`Configuration saved to: ${configPath}.`}
213
- hideBox={true}
214
- />,
215
- );
216
-
217
- // Reload the app configuration to pick up the newly saved config
218
- reloadAppConfig();
219
-
220
- // Reinitialize client with new configuration
221
- try {
222
- const preferences = loadPreferences();
223
- const { client: newClient, actualProvider } = await createLLMClient(
224
- preferences.lastProvider,
225
- );
226
- setClient(newClient);
227
- setCurrentProvider(actualProvider);
228
-
229
- const newModel = newClient.getCurrentModel();
230
- setCurrentModel(newModel);
231
-
232
- // Clear message history when switching providers
233
- setMessages([]);
234
- await newClient.clearContext();
235
-
236
- // Reinitialize MCP servers with the new configuration
237
- const toolManager = getToolManager();
238
- if (toolManager) {
239
- try {
240
- await reinitializeMCPServers(toolManager);
241
- addToChatQueue(
242
- <SuccessMessage
243
- key={`mcp-reinit-${componentKeyCounter}`}
244
- message="MCP servers reinitialized with new configuration."
245
- hideBox={true}
246
- />,
247
- );
248
- } catch (mcpError) {
249
- addToChatQueue(
250
- <ErrorMessage
251
- key={`mcp-reinit-error-${componentKeyCounter}`}
252
- message={`Failed to reinitialize MCP servers: ${String(
253
- mcpError,
254
- )}`}
255
- hideBox={true}
256
- />,
257
- );
258
- }
259
- }
260
-
261
- addToChatQueue(
262
- <SuccessMessage
263
- key={`config-init-${componentKeyCounter}`}
264
- message={`Ready! Using provider: ${actualProvider}, model: ${newModel}`}
265
- hideBox={true}
266
- />,
267
- );
268
- } catch (error) {
269
- addToChatQueue(
270
- <ErrorMessage
271
- key={`config-init-error-${componentKeyCounter}`}
272
- message={`Failed to initialize with new configuration: ${String(
273
- error,
274
- )}`}
275
- hideBox={true}
276
- />,
277
- );
278
- }
279
- }
280
- };
281
-
282
- const handleConfigWizardCancel = () => {
283
- setIsConfigWizardMode(false);
284
- };
285
-
286
- return {
287
- enterModelSelectionMode,
288
- enterProviderSelectionMode,
289
- enterThemeSelectionMode,
290
- enterModelDatabaseMode,
291
- enterConfigWizardMode,
292
- handleModelSelect,
293
- handleModelSelectionCancel,
294
- handleProviderSelect,
295
- handleProviderSelectionCancel,
296
- handleThemeSelect,
297
- handleThemeSelectionCancel,
298
- handleModelDatabaseCancel,
299
- handleConfigWizardComplete,
300
- handleConfigWizardCancel,
301
- };
302
- }