@gguf/coder 0.3.0 → 0.3.1

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 (414) hide show
  1. package/.editorconfig +16 -0
  2. package/.env.example +63 -0
  3. package/.gitattributes +1 -0
  4. package/.semgrepignore +19 -0
  5. package/coder-dummy-file.ts +52 -0
  6. package/coder.config.example.json +59 -0
  7. package/coder.config.json +13 -0
  8. package/color_picker.html +36 -0
  9. package/package.json +2 -14
  10. package/scripts/extract-changelog.js +73 -0
  11. package/scripts/fetch-models.js +143 -0
  12. package/scripts/test.sh +40 -0
  13. package/scripts/update-homebrew-formula.sh +125 -0
  14. package/scripts/update-nix-version.sh +157 -0
  15. package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
  16. package/source/ai-sdk-client/AISDKClient.ts +155 -0
  17. package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
  18. package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
  19. package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
  20. package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
  21. package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
  22. package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
  23. package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
  24. package/source/ai-sdk-client/converters/message-converter.ts +113 -0
  25. package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
  26. package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
  27. package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
  28. package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
  29. package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
  30. package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
  31. package/source/ai-sdk-client/index.ts +7 -0
  32. package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
  33. package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
  34. package/source/ai-sdk-client/types.ts +9 -0
  35. package/source/ai-sdk-client-empty-message.spec.ts +141 -0
  36. package/source/ai-sdk-client-error-handling.spec.ts +186 -0
  37. package/source/ai-sdk-client-maxretries.spec.ts +114 -0
  38. package/source/ai-sdk-client-preparestep.spec.ts +279 -0
  39. package/source/app/App.spec.tsx +32 -0
  40. package/source/app/App.tsx +480 -0
  41. package/source/app/components/AppContainer.spec.tsx +96 -0
  42. package/source/app/components/AppContainer.tsx +56 -0
  43. package/source/app/components/ChatInterface.spec.tsx +163 -0
  44. package/source/app/components/ChatInterface.tsx +144 -0
  45. package/source/app/components/ModalSelectors.spec.tsx +141 -0
  46. package/source/app/components/ModalSelectors.tsx +135 -0
  47. package/source/app/helpers.spec.ts +97 -0
  48. package/source/app/helpers.ts +63 -0
  49. package/source/app/index.ts +4 -0
  50. package/source/app/types.ts +39 -0
  51. package/source/app/utils/appUtils.ts +294 -0
  52. package/source/app/utils/conversationState.ts +310 -0
  53. package/source/app.spec.tsx +244 -0
  54. package/source/cli.spec.ts +73 -0
  55. package/source/cli.tsx +51 -0
  56. package/source/client-factory.spec.ts +48 -0
  57. package/source/client-factory.ts +178 -0
  58. package/source/command-parser.spec.ts +127 -0
  59. package/source/command-parser.ts +36 -0
  60. package/source/commands/checkpoint.spec.tsx +277 -0
  61. package/source/commands/checkpoint.tsx +366 -0
  62. package/source/commands/clear.tsx +22 -0
  63. package/source/commands/custom-commands.tsx +121 -0
  64. package/source/commands/exit.ts +21 -0
  65. package/source/commands/export.spec.tsx +131 -0
  66. package/source/commands/export.tsx +79 -0
  67. package/source/commands/help.tsx +120 -0
  68. package/source/commands/index.ts +17 -0
  69. package/source/commands/init.tsx +339 -0
  70. package/source/commands/lsp-command.spec.tsx +281 -0
  71. package/source/commands/lsp.tsx +120 -0
  72. package/source/commands/mcp-command.spec.tsx +313 -0
  73. package/source/commands/mcp.tsx +162 -0
  74. package/source/commands/model-database.spec.tsx +758 -0
  75. package/source/commands/model-database.tsx +418 -0
  76. package/source/commands/model.ts +12 -0
  77. package/source/commands/provider.ts +12 -0
  78. package/source/commands/setup-config.tsx +16 -0
  79. package/source/commands/simple-commands.spec.tsx +175 -0
  80. package/source/commands/status.ts +12 -0
  81. package/source/commands/theme.ts +12 -0
  82. package/source/commands/update.spec.tsx +261 -0
  83. package/source/commands/update.tsx +201 -0
  84. package/source/commands/usage.spec.tsx +495 -0
  85. package/source/commands/usage.tsx +100 -0
  86. package/source/commands.spec.ts +436 -0
  87. package/source/commands.ts +83 -0
  88. package/source/components/assistant-message.spec.tsx +796 -0
  89. package/source/components/assistant-message.tsx +34 -0
  90. package/source/components/bash-execution-indicator.tsx +21 -0
  91. package/source/components/cancelling-indicator.tsx +16 -0
  92. package/source/components/chat-queue.spec.tsx +83 -0
  93. package/source/components/chat-queue.tsx +36 -0
  94. package/source/components/checkpoint-display.spec.tsx +219 -0
  95. package/source/components/checkpoint-display.tsx +126 -0
  96. package/source/components/checkpoint-selector.spec.tsx +173 -0
  97. package/source/components/checkpoint-selector.tsx +173 -0
  98. package/source/components/development-mode-indicator.spec.tsx +268 -0
  99. package/source/components/development-mode-indicator.tsx +38 -0
  100. package/source/components/message-box.spec.tsx +427 -0
  101. package/source/components/message-box.tsx +87 -0
  102. package/source/components/model-selector.tsx +132 -0
  103. package/source/components/provider-selector.tsx +75 -0
  104. package/source/components/random-spinner.tsx +19 -0
  105. package/source/components/security-disclaimer.tsx +73 -0
  106. package/source/components/status-connection-display.spec.tsx +133 -0
  107. package/source/components/status.tsx +267 -0
  108. package/source/components/theme-selector.tsx +126 -0
  109. package/source/components/tool-confirmation.tsx +190 -0
  110. package/source/components/tool-execution-indicator.tsx +33 -0
  111. package/source/components/tool-message.tsx +85 -0
  112. package/source/components/ui/titled-box.spec.tsx +207 -0
  113. package/source/components/ui/titled-box.tsx +57 -0
  114. package/source/components/usage/progress-bar.spec.tsx +398 -0
  115. package/source/components/usage/progress-bar.tsx +30 -0
  116. package/source/components/usage/usage-display.spec.tsx +780 -0
  117. package/source/components/usage/usage-display.tsx +291 -0
  118. package/source/components/user-input.spec.tsx +327 -0
  119. package/source/components/user-input.tsx +533 -0
  120. package/source/components/user-message.spec.tsx +230 -0
  121. package/source/components/user-message.tsx +84 -0
  122. package/source/components/welcome-message.tsx +76 -0
  123. package/source/config/env-substitution.ts +65 -0
  124. package/source/config/index.spec.ts +171 -0
  125. package/source/config/index.ts +154 -0
  126. package/source/config/paths.spec.ts +241 -0
  127. package/source/config/paths.ts +55 -0
  128. package/source/config/preferences.ts +51 -0
  129. package/source/config/themes.ts +315 -0
  130. package/source/constants.ts +130 -0
  131. package/source/context/mode-context.spec.ts +79 -0
  132. package/source/context/mode-context.ts +24 -0
  133. package/source/custom-commands/executor.spec.ts +142 -0
  134. package/source/custom-commands/executor.ts +64 -0
  135. package/source/custom-commands/loader.spec.ts +314 -0
  136. package/source/custom-commands/loader.ts +153 -0
  137. package/source/custom-commands/parser.ts +196 -0
  138. package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
  139. package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
  140. package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
  141. package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
  142. package/source/hooks/chat-handler/index.ts +12 -0
  143. package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
  144. package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
  145. package/source/hooks/chat-handler/types.ts +38 -0
  146. package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
  147. package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
  148. package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
  149. package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
  150. package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
  151. package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
  152. package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
  153. package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
  154. package/source/hooks/useAppHandlers.tsx +291 -0
  155. package/source/hooks/useAppInitialization.tsx +422 -0
  156. package/source/hooks/useAppState.tsx +311 -0
  157. package/source/hooks/useDirectoryTrust.tsx +98 -0
  158. package/source/hooks/useInputState.ts +414 -0
  159. package/source/hooks/useModeHandlers.tsx +302 -0
  160. package/source/hooks/useNonInteractiveMode.ts +140 -0
  161. package/source/hooks/useTerminalWidth.tsx +81 -0
  162. package/source/hooks/useTheme.ts +18 -0
  163. package/source/hooks/useToolHandler.tsx +349 -0
  164. package/source/hooks/useUIState.ts +61 -0
  165. package/source/init/agents-template-generator.ts +421 -0
  166. package/source/init/existing-rules-extractor.ts +319 -0
  167. package/source/init/file-scanner.spec.ts +227 -0
  168. package/source/init/file-scanner.ts +238 -0
  169. package/source/init/framework-detector.ts +382 -0
  170. package/source/init/language-detector.ts +269 -0
  171. package/source/init/project-analyzer.spec.ts +231 -0
  172. package/source/init/project-analyzer.ts +458 -0
  173. package/source/lsp/index.ts +31 -0
  174. package/source/lsp/lsp-client.spec.ts +508 -0
  175. package/source/lsp/lsp-client.ts +487 -0
  176. package/source/lsp/lsp-manager.spec.ts +477 -0
  177. package/source/lsp/lsp-manager.ts +419 -0
  178. package/source/lsp/protocol.spec.ts +502 -0
  179. package/source/lsp/protocol.ts +360 -0
  180. package/source/lsp/server-discovery.spec.ts +654 -0
  181. package/source/lsp/server-discovery.ts +515 -0
  182. package/source/markdown-parser/html-entities.spec.ts +88 -0
  183. package/source/markdown-parser/html-entities.ts +45 -0
  184. package/source/markdown-parser/index.spec.ts +281 -0
  185. package/source/markdown-parser/index.ts +126 -0
  186. package/source/markdown-parser/table-parser.spec.ts +133 -0
  187. package/source/markdown-parser/table-parser.ts +114 -0
  188. package/source/markdown-parser/utils.spec.ts +70 -0
  189. package/source/markdown-parser/utils.ts +13 -0
  190. package/source/mcp/mcp-client.spec.ts +81 -0
  191. package/source/mcp/mcp-client.ts +625 -0
  192. package/source/mcp/transport-factory.spec.ts +406 -0
  193. package/source/mcp/transport-factory.ts +312 -0
  194. package/source/message-handler.ts +67 -0
  195. package/source/model-database/database-engine.spec.ts +494 -0
  196. package/source/model-database/database-engine.ts +50 -0
  197. package/source/model-database/model-database.spec.ts +363 -0
  198. package/source/model-database/model-database.ts +91 -0
  199. package/source/model-database/model-engine.spec.ts +447 -0
  200. package/source/model-database/model-engine.ts +65 -0
  201. package/source/model-database/model-fetcher.spec.ts +583 -0
  202. package/source/model-database/model-fetcher.ts +330 -0
  203. package/source/models/index.ts +1 -0
  204. package/source/models/models-cache.spec.ts +214 -0
  205. package/source/models/models-cache.ts +78 -0
  206. package/source/models/models-dev-client.spec.ts +379 -0
  207. package/source/models/models-dev-client.ts +329 -0
  208. package/source/models/models-types.ts +68 -0
  209. package/source/prompt-history.ts +155 -0
  210. package/source/security/command-injection.spec.ts +240 -0
  211. package/source/services/checkpoint-manager.spec.ts +523 -0
  212. package/source/services/checkpoint-manager.ts +466 -0
  213. package/source/services/file-snapshot.spec.ts +569 -0
  214. package/source/services/file-snapshot.ts +220 -0
  215. package/source/test-utils/render-with-theme.tsx +48 -0
  216. package/source/tokenization/index.ts +1 -0
  217. package/source/tokenization/tokenizer-factory.spec.ts +170 -0
  218. package/source/tokenization/tokenizer-factory.ts +125 -0
  219. package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
  220. package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
  221. package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
  222. package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
  223. package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
  224. package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
  225. package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
  226. package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
  227. package/source/tool-calling/index.ts +5 -0
  228. package/source/tool-calling/json-parser.spec.ts +639 -0
  229. package/source/tool-calling/json-parser.ts +247 -0
  230. package/source/tool-calling/tool-parser.spec.ts +395 -0
  231. package/source/tool-calling/tool-parser.ts +120 -0
  232. package/source/tool-calling/xml-parser.spec.ts +662 -0
  233. package/source/tool-calling/xml-parser.ts +289 -0
  234. package/source/tools/execute-bash.spec.tsx +353 -0
  235. package/source/tools/execute-bash.tsx +219 -0
  236. package/source/tools/execute-function.spec.ts +130 -0
  237. package/source/tools/fetch-url.spec.tsx +342 -0
  238. package/source/tools/fetch-url.tsx +172 -0
  239. package/source/tools/find-files.spec.tsx +924 -0
  240. package/source/tools/find-files.tsx +293 -0
  241. package/source/tools/index.ts +102 -0
  242. package/source/tools/lsp-get-diagnostics.tsx +192 -0
  243. package/source/tools/needs-approval.spec.ts +282 -0
  244. package/source/tools/read-file.spec.tsx +801 -0
  245. package/source/tools/read-file.tsx +387 -0
  246. package/source/tools/search-file-contents.spec.tsx +1273 -0
  247. package/source/tools/search-file-contents.tsx +293 -0
  248. package/source/tools/string-replace.spec.tsx +730 -0
  249. package/source/tools/string-replace.tsx +548 -0
  250. package/source/tools/tool-manager.ts +210 -0
  251. package/source/tools/tool-registry.spec.ts +415 -0
  252. package/source/tools/tool-registry.ts +228 -0
  253. package/source/tools/web-search.tsx +223 -0
  254. package/source/tools/write-file.spec.tsx +559 -0
  255. package/source/tools/write-file.tsx +228 -0
  256. package/source/types/app.ts +37 -0
  257. package/source/types/checkpoint.ts +48 -0
  258. package/source/types/commands.ts +46 -0
  259. package/source/types/components.ts +27 -0
  260. package/source/types/config.ts +103 -0
  261. package/source/types/core-connection-status.spec.ts +67 -0
  262. package/source/types/core.ts +181 -0
  263. package/source/types/hooks.ts +50 -0
  264. package/source/types/index.ts +12 -0
  265. package/source/types/markdown-parser.ts +11 -0
  266. package/source/types/mcp.ts +52 -0
  267. package/source/types/system.ts +16 -0
  268. package/source/types/tokenization.ts +41 -0
  269. package/source/types/ui.ts +40 -0
  270. package/source/types/usage.ts +58 -0
  271. package/source/types/utils.ts +16 -0
  272. package/source/usage/calculator.spec.ts +385 -0
  273. package/source/usage/calculator.ts +104 -0
  274. package/source/usage/storage.spec.ts +703 -0
  275. package/source/usage/storage.ts +238 -0
  276. package/source/usage/tracker.spec.ts +456 -0
  277. package/source/usage/tracker.ts +102 -0
  278. package/source/utils/atomic-deletion.spec.ts +194 -0
  279. package/source/utils/atomic-deletion.ts +127 -0
  280. package/source/utils/bounded-map.spec.ts +300 -0
  281. package/source/utils/bounded-map.ts +193 -0
  282. package/source/utils/checkpoint-utils.spec.ts +222 -0
  283. package/source/utils/checkpoint-utils.ts +92 -0
  284. package/source/utils/error-formatter.spec.ts +169 -0
  285. package/source/utils/error-formatter.ts +194 -0
  286. package/source/utils/file-autocomplete.spec.ts +173 -0
  287. package/source/utils/file-autocomplete.ts +196 -0
  288. package/source/utils/file-cache.spec.ts +309 -0
  289. package/source/utils/file-cache.ts +195 -0
  290. package/source/utils/file-content-loader.spec.ts +180 -0
  291. package/source/utils/file-content-loader.ts +179 -0
  292. package/source/utils/file-mention-handler.spec.ts +261 -0
  293. package/source/utils/file-mention-handler.ts +84 -0
  294. package/source/utils/file-mention-parser.spec.ts +182 -0
  295. package/source/utils/file-mention-parser.ts +170 -0
  296. package/source/utils/fuzzy-matching.spec.ts +149 -0
  297. package/source/utils/fuzzy-matching.ts +146 -0
  298. package/source/utils/indentation-normalizer.spec.ts +216 -0
  299. package/source/utils/indentation-normalizer.ts +76 -0
  300. package/source/utils/installation-detector.spec.ts +178 -0
  301. package/source/utils/installation-detector.ts +153 -0
  302. package/source/utils/logging/config.spec.ts +311 -0
  303. package/source/utils/logging/config.ts +210 -0
  304. package/source/utils/logging/console-facade.spec.ts +184 -0
  305. package/source/utils/logging/console-facade.ts +384 -0
  306. package/source/utils/logging/correlation.spec.ts +679 -0
  307. package/source/utils/logging/correlation.ts +474 -0
  308. package/source/utils/logging/formatters.spec.ts +464 -0
  309. package/source/utils/logging/formatters.ts +207 -0
  310. package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
  311. package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
  312. package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
  313. package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
  314. package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
  315. package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
  316. package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
  317. package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
  318. package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
  319. package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
  320. package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
  321. package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
  322. package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
  323. package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
  324. package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
  325. package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
  326. package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
  327. package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
  328. package/source/utils/logging/health-monitor/index.ts +15 -0
  329. package/source/utils/logging/health-monitor/instances.ts +48 -0
  330. package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
  331. package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
  332. package/source/utils/logging/health-monitor/types.ts +126 -0
  333. package/source/utils/logging/index.spec.ts +284 -0
  334. package/source/utils/logging/index.ts +236 -0
  335. package/source/utils/logging/integration.spec.ts +441 -0
  336. package/source/utils/logging/log-method-factory.spec.ts +573 -0
  337. package/source/utils/logging/log-method-factory.ts +233 -0
  338. package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
  339. package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
  340. package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
  341. package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
  342. package/source/utils/logging/log-query/index.ts +23 -0
  343. package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
  344. package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
  345. package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
  346. package/source/utils/logging/log-query/query/query-builder.ts +151 -0
  347. package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
  348. package/source/utils/logging/log-query/query/query-engine.ts +45 -0
  349. package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
  350. package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
  351. package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
  352. package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
  353. package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
  354. package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
  355. package/source/utils/logging/log-query/types.ts +163 -0
  356. package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
  357. package/source/utils/logging/log-query/utils/helpers.ts +72 -0
  358. package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
  359. package/source/utils/logging/log-query/utils/sorting.ts +61 -0
  360. package/source/utils/logging/logger-provider.spec.ts +262 -0
  361. package/source/utils/logging/logger-provider.ts +362 -0
  362. package/source/utils/logging/performance.spec.ts +209 -0
  363. package/source/utils/logging/performance.ts +757 -0
  364. package/source/utils/logging/pino-logger.spec.ts +425 -0
  365. package/source/utils/logging/pino-logger.ts +514 -0
  366. package/source/utils/logging/redaction.spec.ts +490 -0
  367. package/source/utils/logging/redaction.ts +267 -0
  368. package/source/utils/logging/request-tracker.spec.ts +1198 -0
  369. package/source/utils/logging/request-tracker.ts +803 -0
  370. package/source/utils/logging/transports.spec.ts +505 -0
  371. package/source/utils/logging/transports.ts +305 -0
  372. package/source/utils/logging/types.ts +216 -0
  373. package/source/utils/message-builder.spec.ts +179 -0
  374. package/source/utils/message-builder.ts +101 -0
  375. package/source/utils/message-queue.tsx +486 -0
  376. package/source/utils/paste-detection.spec.ts +69 -0
  377. package/source/utils/paste-detection.ts +124 -0
  378. package/source/utils/paste-roundtrip.spec.ts +442 -0
  379. package/source/utils/paste-utils.spec.ts +128 -0
  380. package/source/utils/paste-utils.ts +52 -0
  381. package/source/utils/programming-language-helper.spec.ts +74 -0
  382. package/source/utils/programming-language-helper.ts +32 -0
  383. package/source/utils/prompt-assembly.spec.ts +221 -0
  384. package/source/utils/prompt-processor.ts +173 -0
  385. package/source/utils/tool-args-parser.spec.ts +136 -0
  386. package/source/utils/tool-args-parser.ts +54 -0
  387. package/source/utils/tool-cancellation.spec.ts +230 -0
  388. package/source/utils/tool-cancellation.ts +28 -0
  389. package/source/utils/tool-result-display.spec.tsx +469 -0
  390. package/source/utils/tool-result-display.tsx +90 -0
  391. package/source/utils/update-checker.spec.ts +383 -0
  392. package/source/utils/update-checker.ts +183 -0
  393. package/source/wizard/config-wizard.spec.tsx +103 -0
  394. package/source/wizard/config-wizard.tsx +382 -0
  395. package/source/wizard/steps/location-step.spec.tsx +186 -0
  396. package/source/wizard/steps/location-step.tsx +147 -0
  397. package/source/wizard/steps/mcp-step.spec.tsx +607 -0
  398. package/source/wizard/steps/mcp-step.tsx +632 -0
  399. package/source/wizard/steps/provider-step.spec.tsx +342 -0
  400. package/source/wizard/steps/provider-step.tsx +957 -0
  401. package/source/wizard/steps/summary-step.spec.tsx +749 -0
  402. package/source/wizard/steps/summary-step.tsx +228 -0
  403. package/source/wizard/templates/mcp-templates.spec.ts +613 -0
  404. package/source/wizard/templates/mcp-templates.ts +570 -0
  405. package/source/wizard/templates/provider-templates.spec.ts +152 -0
  406. package/source/wizard/templates/provider-templates.ts +485 -0
  407. package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
  408. package/source/wizard/utils/fetch-cloud-models.ts +223 -0
  409. package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
  410. package/source/wizard/utils/fetch-local-models.ts +192 -0
  411. package/source/wizard/validation-array.spec.ts +264 -0
  412. package/source/wizard/validation.spec.ts +373 -0
  413. package/source/wizard/validation.ts +232 -0
  414. package/source/app/prompts/main-prompt.md +0 -122
@@ -0,0 +1,101 @@
1
+ import type {Message, ToolResult} from '@/types/core';
2
+
3
+ /**
4
+ * Builder pattern for constructing message arrays.
5
+ * Provides a fluent interface for adding messages without side effects.
6
+ * This ensures messages are only added to state once, preventing duplication.
7
+ */
8
+ export class MessageBuilder {
9
+ private messages: Message[];
10
+
11
+ constructor(initialMessages: Message[]) {
12
+ this.messages = [...initialMessages];
13
+ }
14
+
15
+ /**
16
+ * Add auto-executed messages from AI SDK multi-step execution.
17
+ * These include both assistant messages (with tool_calls) and tool result messages.
18
+ */
19
+ addAutoExecutedMessages(autoMessages: Message[]): this {
20
+ this.messages.push(...autoMessages);
21
+ return this;
22
+ }
23
+
24
+ /**
25
+ * Add an assistant message (with or without tool_calls).
26
+ */
27
+ addAssistantMessage(msg: Message): this {
28
+ if (msg.role !== 'assistant') {
29
+ throw new Error(
30
+ 'addAssistantMessage requires a message with role "assistant"',
31
+ );
32
+ }
33
+ this.messages.push(msg);
34
+ return this;
35
+ }
36
+
37
+ /**
38
+ * Add tool result messages from tool execution.
39
+ */
40
+ addToolResults(results: ToolResult[]): this {
41
+ const toolMessages: Message[] = results.map(result => ({
42
+ role: 'tool' as const,
43
+ content: result.content || '',
44
+ tool_call_id: result.tool_call_id,
45
+ name: result.name,
46
+ }));
47
+ this.messages.push(...toolMessages);
48
+ return this;
49
+ }
50
+
51
+ /**
52
+ * Add a user message.
53
+ */
54
+ addUserMessage(content: string): this {
55
+ this.messages.push({
56
+ role: 'user',
57
+ content,
58
+ });
59
+ return this;
60
+ }
61
+
62
+ /**
63
+ * Add an error message as a user message (for model self-correction).
64
+ */
65
+ addErrorMessage(errorContent: string): this {
66
+ this.messages.push({
67
+ role: 'user',
68
+ content: errorContent,
69
+ });
70
+ return this;
71
+ }
72
+
73
+ /**
74
+ * Add an arbitrary message (use sparingly, prefer specific methods).
75
+ */
76
+ addMessage(message: Message): this {
77
+ this.messages.push(message);
78
+ return this;
79
+ }
80
+
81
+ /**
82
+ * Build and return the final messages array.
83
+ */
84
+ build(): Message[] {
85
+ return this.messages;
86
+ }
87
+
88
+ /**
89
+ * Get the current length of the messages array.
90
+ */
91
+ get length(): number {
92
+ return this.messages.length;
93
+ }
94
+
95
+ /**
96
+ * Check if the builder has any messages.
97
+ */
98
+ get isEmpty(): boolean {
99
+ return this.messages.length === 0;
100
+ }
101
+ }
@@ -0,0 +1,486 @@
1
+ import {
2
+ ErrorMessage,
3
+ InfoMessage,
4
+ SuccessMessage,
5
+ WarningMessage,
6
+ } from '@/components/message-box';
7
+ import {TIMEOUT_MESSAGE_PROCESSING_MS} from '@/constants';
8
+ import type {MessageType} from '@/types/index';
9
+ import {createErrorInfo} from '@/utils/error-formatter';
10
+ // Import logging utilities with dependency injection pattern
11
+ import {
12
+ calculateMemoryDelta,
13
+ endMetrics,
14
+ formatMemoryUsage,
15
+ generateCorrelationId,
16
+ startMetrics,
17
+ withNewCorrelationContext,
18
+ } from '@/utils/logging';
19
+ import React from 'react';
20
+
21
+ // Global message queue function - will be set by App component
22
+ let globalAddToChatQueue: ((component: React.ReactNode) => void) | null = null;
23
+ let componentKeyCounter = 0;
24
+
25
+ // Get logger instance to avoid circular dependencies
26
+ import {getLogger} from '@/utils/logging';
27
+ const logger = getLogger();
28
+
29
+ // Set the global chat queue function
30
+ export function setGlobalMessageQueue(
31
+ addToChatQueue: (component: React.ReactNode) => void,
32
+ ) {
33
+ logger.info('Global message queue initialized', {
34
+ hasPreviousQueue: !!globalAddToChatQueue,
35
+ });
36
+ globalAddToChatQueue = addToChatQueue;
37
+ }
38
+
39
+ // Helper function to generate stable keys
40
+ function getNextKey(): string {
41
+ componentKeyCounter++;
42
+ return `global-msg-${componentKeyCounter}`;
43
+ }
44
+
45
+ // Enhanced message metadata for tracking and debugging
46
+ export interface MessageMetadata {
47
+ id: string;
48
+ type: MessageType;
49
+ timestamp: string;
50
+ correlationId?: string;
51
+ duration?: number;
52
+ source?: string;
53
+ context?: Record<string, unknown>;
54
+ performanceMetrics?: {
55
+ duration: number;
56
+ memoryDelta: number;
57
+ };
58
+ }
59
+
60
+ // Message queue statistics for monitoring
61
+ export interface MessageQueueStats {
62
+ totalMessages: number;
63
+ messagesByType: Record<MessageType, number>;
64
+ averageRenderTime: number;
65
+ lastMessageTime: string;
66
+ errorsLogged: number;
67
+ }
68
+
69
+ // Global message statistics
70
+ let messageStats: MessageQueueStats = {
71
+ totalMessages: 0,
72
+ messagesByType: {
73
+ info: 0,
74
+ success: 0,
75
+ warning: 0,
76
+ error: 0,
77
+ },
78
+ averageRenderTime: 0,
79
+ lastMessageTime: '',
80
+ errorsLogged: 0,
81
+ };
82
+
83
+ // Add a React component directly to the queue
84
+ export function addToMessageQueue(component: React.ReactNode) {
85
+ if (!globalAddToChatQueue) {
86
+ console.log('[message-queue] Queue not available, component not added');
87
+ return;
88
+ }
89
+ globalAddToChatQueue(component);
90
+ }
91
+
92
+ // Add typed message to chat queue (internal helper) with enhanced logging and metadata
93
+ function addTypedMessage(
94
+ type: MessageType,
95
+ message: string,
96
+ hideBox: boolean = true,
97
+ options?: {
98
+ correlationId?: string;
99
+ source?: string;
100
+ context?: Record<string, unknown>;
101
+ error?: unknown;
102
+ },
103
+ ) {
104
+ const correlationId = options?.correlationId || generateCorrelationId();
105
+ const metrics = startMetrics();
106
+ const timestamp = new Date().toISOString();
107
+
108
+ return withNewCorrelationContext(() => {
109
+ // Log the message to structured logging system
110
+ logger[
111
+ type === 'error'
112
+ ? 'error'
113
+ : type === 'warning'
114
+ ? 'warn'
115
+ : type === 'success'
116
+ ? 'info'
117
+ : 'info'
118
+ ](`Message queued: ${type.toUpperCase()}`, {
119
+ messageType: type,
120
+ message: message.substring(0, 200), // Truncate long messages for logs
121
+ hideBox,
122
+ source: options?.source || 'unknown',
123
+ context: options?.context,
124
+ correlationId,
125
+ hasGlobalQueue: !!globalAddToChatQueue,
126
+ messageId: `msg-${componentKeyCounter + 1}`,
127
+ });
128
+
129
+ // Log error details if provided
130
+ if (options?.error && type === 'error') {
131
+ const errorInfo = createErrorInfo(
132
+ options.error,
133
+ options.context,
134
+ correlationId,
135
+ );
136
+ logger.error('Message queue error details', {
137
+ errorInfo,
138
+ correlationId,
139
+ });
140
+ }
141
+
142
+ // Update statistics
143
+ messageStats.totalMessages++;
144
+ messageStats.messagesByType[type]++;
145
+ messageStats.lastMessageTime = timestamp;
146
+ if (type === 'error') {
147
+ messageStats.errorsLogged++;
148
+ }
149
+
150
+ // Fallback to structured logging if queue not available
151
+ if (!globalAddToChatQueue) {
152
+ logger.warn(
153
+ 'Message queue not available, using structured logging fallback',
154
+ {
155
+ messageType: type,
156
+ message: message.substring(0, 100),
157
+ correlationId,
158
+ },
159
+ );
160
+
161
+ // Use structured logging instead of console
162
+ if (type === 'error') {
163
+ logger.error(message, {
164
+ correlationId,
165
+ source: 'message-queue-fallback',
166
+ });
167
+ } else if (type === 'warning') {
168
+ logger.warn(message, {correlationId, source: 'message-queue-fallback'});
169
+ } else {
170
+ logger.info(message, {correlationId, source: 'message-queue-fallback'});
171
+ }
172
+ return;
173
+ }
174
+
175
+ const key = getNextKey();
176
+ let component: React.ReactNode;
177
+
178
+ switch (type) {
179
+ case 'error':
180
+ component = (
181
+ <ErrorMessage key={key} message={message} hideBox={hideBox} />
182
+ );
183
+ break;
184
+ case 'success':
185
+ component = (
186
+ <SuccessMessage key={key} message={message} hideBox={hideBox} />
187
+ );
188
+ break;
189
+ case 'warning':
190
+ component = (
191
+ <WarningMessage key={key} message={message} hideBox={hideBox} />
192
+ );
193
+ break;
194
+ case 'info':
195
+ default:
196
+ component = (
197
+ <InfoMessage key={key} message={message} hideBox={hideBox} />
198
+ );
199
+ break;
200
+ }
201
+
202
+ // Track performance metrics
203
+ const finalMetrics = endMetrics(metrics);
204
+ const memoryDelta = calculateMemoryDelta(
205
+ // biome-ignore lint/style/noNonNullAssertion: memoryUsage is always defined after endMetrics
206
+ metrics.memoryUsage!,
207
+ // biome-ignore lint/style/noNonNullAssertion: memoryUsage is always defined after endMetrics
208
+ finalMetrics.memoryUsage!,
209
+ );
210
+
211
+ logger.debug('Message component created', {
212
+ messageType: type,
213
+ componentKey: key,
214
+ renderTime: `${finalMetrics.duration.toFixed(2)}ms`,
215
+ memoryDelta: formatMemoryUsage(
216
+ memoryDelta as unknown as NodeJS.MemoryUsage,
217
+ ),
218
+ correlationId,
219
+ });
220
+
221
+ // Add to global queue
222
+ globalAddToChatQueue(component);
223
+ }, correlationId);
224
+ }
225
+
226
+ // Enhanced convenience functions with additional context
227
+ export function logInfo(
228
+ message: string,
229
+ hideBox: boolean = true,
230
+ options?: {
231
+ source?: string;
232
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic format args
233
+ context?: Record<string, any>;
234
+ correlationId?: string;
235
+ },
236
+ ) {
237
+ addTypedMessage('info', message, hideBox, {
238
+ ...options,
239
+ source: options?.source || 'logInfo',
240
+ });
241
+ }
242
+
243
+ export function logError(
244
+ message: string,
245
+ hideBox: boolean = true,
246
+ options?: {
247
+ source?: string;
248
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic format args
249
+ context?: Record<string, any>;
250
+ correlationId?: string;
251
+ error?: unknown;
252
+ },
253
+ ) {
254
+ addTypedMessage('error', message, hideBox, {
255
+ ...options,
256
+ source: options?.source || 'logError',
257
+ });
258
+ }
259
+
260
+ export function logSuccess(
261
+ message: string,
262
+ hideBox: boolean = true,
263
+ options?: {
264
+ source?: string;
265
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic format args
266
+ context?: Record<string, any>;
267
+ correlationId?: string;
268
+ },
269
+ ) {
270
+ addTypedMessage('success', message, hideBox, {
271
+ ...options,
272
+ source: options?.source || 'logSuccess',
273
+ });
274
+ }
275
+
276
+ export function logWarning(
277
+ message: string,
278
+ hideBox: boolean = true,
279
+ options?: {
280
+ source?: string;
281
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic format args
282
+ context?: Record<string, any>;
283
+ correlationId?: string;
284
+ },
285
+ ) {
286
+ addTypedMessage('warning', message, hideBox, {
287
+ ...options,
288
+ source: options?.source || 'logWarning',
289
+ });
290
+ }
291
+
292
+ // Specialized logging functions for common scenarios
293
+ export function logApiCall(
294
+ method: string,
295
+ url: string,
296
+ statusCode: number,
297
+ duration: number,
298
+ options?: {
299
+ requestSize?: number;
300
+ responseSize?: number;
301
+ correlationId?: string;
302
+ },
303
+ ) {
304
+ const correlationId = options?.correlationId || generateCorrelationId();
305
+
306
+ withNewCorrelationContext(() => {
307
+ if (statusCode >= 400) {
308
+ logError(`API ${method} ${url} failed (${statusCode})`, false, {
309
+ source: 'api-call',
310
+ correlationId,
311
+ context: {
312
+ method,
313
+ url,
314
+ statusCode,
315
+ duration: `${duration}ms`,
316
+ requestSize: options?.requestSize,
317
+ responseSize: options?.responseSize,
318
+ },
319
+ });
320
+ } else {
321
+ logInfo(`API ${method} ${url} completed (${statusCode})`, true, {
322
+ source: 'api-call',
323
+ correlationId,
324
+ context: {
325
+ method,
326
+ url,
327
+ statusCode,
328
+ duration: `${duration}ms`,
329
+ requestSize: options?.requestSize,
330
+ responseSize: options?.responseSize,
331
+ },
332
+ });
333
+ }
334
+ }, correlationId);
335
+ }
336
+
337
+ export function logToolExecution(
338
+ toolName: string,
339
+ status: 'started' | 'completed' | 'failed',
340
+ duration?: number,
341
+ options?: {
342
+ correlationId?: string;
343
+ error?: unknown;
344
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic format args
345
+ context?: Record<string, any>;
346
+ },
347
+ ) {
348
+ const correlationId = options?.correlationId || generateCorrelationId();
349
+ const context = {
350
+ toolName,
351
+ status,
352
+ duration: duration ? `${duration}ms` : undefined,
353
+ ...options?.context,
354
+ };
355
+
356
+ switch (status) {
357
+ case 'started':
358
+ logInfo(`Tool execution started: ${toolName}`, true, {
359
+ source: 'tool-execution',
360
+ correlationId,
361
+ context,
362
+ });
363
+ break;
364
+ case 'completed':
365
+ logSuccess(`Tool execution completed: ${toolName}`, true, {
366
+ source: 'tool-execution',
367
+ correlationId,
368
+ context,
369
+ });
370
+ break;
371
+ case 'failed':
372
+ logError(`Tool execution failed: ${toolName}`, false, {
373
+ source: 'tool-execution',
374
+ correlationId,
375
+ context,
376
+ error: options?.error,
377
+ });
378
+ break;
379
+ }
380
+ }
381
+
382
+ export function logUserAction(
383
+ action: string,
384
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic details type
385
+ details?: Record<string, any>,
386
+ options?: {
387
+ correlationId?: string;
388
+ },
389
+ ) {
390
+ logInfo(`User action: ${action}`, true, {
391
+ source: 'user-action',
392
+ correlationId: options?.correlationId,
393
+ context: {
394
+ action,
395
+ ...details,
396
+ },
397
+ });
398
+ }
399
+
400
+ // Get current message queue statistics
401
+ export function getMessageQueueStats(): MessageQueueStats {
402
+ return {...messageStats};
403
+ }
404
+
405
+ // Reset message queue statistics
406
+ export function resetMessageQueueStats() {
407
+ messageStats = {
408
+ totalMessages: 0,
409
+ messagesByType: {
410
+ info: 0,
411
+ success: 0,
412
+ warning: 0,
413
+ error: 0,
414
+ },
415
+ averageRenderTime: 0,
416
+ lastMessageTime: '',
417
+ errorsLogged: 0,
418
+ };
419
+
420
+ logger.info('Message queue statistics reset', {
421
+ correlationId: generateCorrelationId(),
422
+ });
423
+ }
424
+
425
+ // Log current message queue statistics
426
+ export function logMessageQueueStats() {
427
+ logger.info('Message queue statistics', {
428
+ stats: messageStats,
429
+ correlationId: generateCorrelationId(),
430
+ });
431
+ }
432
+
433
+ // Enhanced message queue health check
434
+ export function checkMessageQueueHealth(): {
435
+ isHealthy: boolean;
436
+ issues: string[];
437
+ stats: MessageQueueStats;
438
+ } {
439
+ const issues: string[] = [];
440
+
441
+ // Check if queue is initialized
442
+ if (!globalAddToChatQueue) {
443
+ issues.push('Global message queue not initialized');
444
+ }
445
+
446
+ // Check error rate
447
+ const errorRate =
448
+ messageStats.totalMessages > 0
449
+ ? (messageStats.errorsLogged / messageStats.totalMessages) * 100
450
+ : 0;
451
+
452
+ if (errorRate > 20) {
453
+ // More than 20% errors is concerning
454
+ issues.push(`High error rate: ${errorRate.toFixed(1)}%`);
455
+ }
456
+
457
+ // Check if messages are being processed
458
+ if (messageStats.lastMessageTime) {
459
+ const lastMessageAge =
460
+ Date.now() - new Date(messageStats.lastMessageTime).getTime();
461
+
462
+ if (
463
+ lastMessageAge > TIMEOUT_MESSAGE_PROCESSING_MS &&
464
+ messageStats.totalMessages > 0
465
+ ) {
466
+ issues.push(
467
+ `No messages for ${Math.round(lastMessageAge / 60000)} minutes`,
468
+ );
469
+ }
470
+ }
471
+
472
+ const isHealthy = issues.length === 0;
473
+
474
+ logger.debug('Message queue health check', {
475
+ isHealthy,
476
+ issues,
477
+ stats: messageStats,
478
+ correlationId: generateCorrelationId(),
479
+ });
480
+
481
+ return {
482
+ isHealthy,
483
+ issues,
484
+ stats: messageStats,
485
+ };
486
+ }
@@ -0,0 +1,69 @@
1
+ import test from 'ava';
2
+ import {PasteDetector} from './paste-detection';
3
+
4
+ // Tests for PasteDetector class
5
+ // Validates CLI paste detection logic
6
+
7
+ console.log(`\npaste-detection.spec.ts`);
8
+
9
+ test('PasteDetector detects rapid input as paste', t => {
10
+ const detector = new PasteDetector();
11
+
12
+ // Simulate rapid input - use 110 chars to exceed 50*2=100 threshold
13
+ const result = detector.detectPaste('a'.repeat(110));
14
+
15
+ t.true(result.isPaste);
16
+ t.is(result.method, 'size'); // Large input detected as paste
17
+ t.is(result.addedText, 'a'.repeat(110));
18
+ });
19
+
20
+ test('PasteDetector detects multi-line input as paste', t => {
21
+ const detector = new PasteDetector();
22
+
23
+ const multiLineText = 'line1\nline2\nline3\nline4';
24
+ const result = detector.detectPaste(multiLineText);
25
+
26
+ t.true(result.isPaste);
27
+ // With low thresholds, size method triggers first (25 chars > 1*2 = 2)
28
+ // but still correctly detected as paste
29
+ t.true(['size', 'lines'].includes(result.method));
30
+ t.is(result.addedText, multiLineText);
31
+ });
32
+
33
+ test('PasteDetector detects small paste', t => {
34
+ const detector = new PasteDetector();
35
+
36
+ // 15 characters - enough to trigger size detection (> 5*2 = 10)
37
+ const result = detector.detectPaste('small paste txt');
38
+
39
+ t.true(result.isPaste);
40
+ t.is(result.method, 'size'); // 15 chars > 5*2 = 10
41
+ });
42
+
43
+ test('PasteDetector does not detect manual typing', async t => {
44
+ const detector = new PasteDetector();
45
+
46
+ // First input - 5 chars, below 10-char size threshold
47
+ const result1 = detector.detectPaste('hello');
48
+ t.false(result1.isPaste);
49
+ t.is(result1.method, 'none');
50
+
51
+ // Wait to simulate human typing speed (not a paste)
52
+ await new Promise(resolve => setTimeout(resolve, 100));
53
+
54
+ // Add more text (incremental) - adds " world" (6 chars), still below threshold
55
+ const result2 = detector.detectPaste('hello world');
56
+ t.false(result2.isPaste);
57
+ t.is(result2.addedText, ' world');
58
+ t.is(result2.method, 'none');
59
+ });
60
+
61
+ test('PasteDetector reset clears state', t => {
62
+ const detector = new PasteDetector();
63
+
64
+ detector.detectPaste('some text');
65
+ detector.reset();
66
+
67
+ const result = detector.detectPaste('new text');
68
+ t.is(result.addedText, 'new text'); // Should be full text, not just diff
69
+ });