@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,70 @@
1
+ import {XMLToolCallParser} from '@/tool-calling/xml-parser';
2
+ import type {AISDKCoreTool, StreamCallbacks, ToolCall} from '@/types/index';
3
+ import {getLogger} from '@/utils/logging';
4
+
5
+ export interface XMLToolProcessingResult {
6
+ toolCalls: ToolCall[];
7
+ cleanedContent: string;
8
+ }
9
+
10
+ /**
11
+ * Processes XML tool calls from response content
12
+ */
13
+ export function processXMLToolCalls(
14
+ content: string,
15
+ tools: Record<string, AISDKCoreTool>,
16
+ callbacks: StreamCallbacks,
17
+ ): XMLToolProcessingResult {
18
+ const logger = getLogger();
19
+ const toolCalls: ToolCall[] = [];
20
+ let cleanedContent = content;
21
+
22
+ // Only process if tools are available and no native tool calls were found
23
+ if (Object.keys(tools).length === 0 || !content) {
24
+ return {toolCalls, cleanedContent};
25
+ }
26
+
27
+ logger.debug('Checking for XML tool calls in response content');
28
+
29
+ // First check for malformed XML tool calls
30
+ const malformedError = XMLToolCallParser.detectMalformedToolCall(content);
31
+ if (malformedError) {
32
+ logger.warn('Malformed XML tool call detected', {
33
+ error: malformedError.error,
34
+ });
35
+
36
+ // Return malformed tool call with validation error
37
+ // This mimics how validators work - returns tool call that will show error
38
+ const malformedCall: ToolCall = {
39
+ id: 'malformed_xml_validation',
40
+ function: {
41
+ name: '__xml_validation_error__',
42
+ arguments: {
43
+ error: malformedError.error,
44
+ },
45
+ },
46
+ };
47
+ toolCalls.push(malformedCall);
48
+ callbacks.onToolCall?.(malformedCall);
49
+ cleanedContent = ''; // Clear content since it was malformed
50
+ } else if (XMLToolCallParser.hasToolCalls(content)) {
51
+ logger.debug('Parsing XML tool calls from content');
52
+
53
+ // Try to parse well-formed XML tool calls
54
+ const parsedToolCalls = XMLToolCallParser.parseToolCalls(content);
55
+ const xmlToolCalls = XMLToolCallParser.convertToToolCalls(parsedToolCalls);
56
+ cleanedContent = XMLToolCallParser.removeToolCallsFromContent(content);
57
+
58
+ logger.debug('XML tool calls parsed', {
59
+ toolCallCount: xmlToolCalls.length,
60
+ contentLength: cleanedContent.length,
61
+ });
62
+
63
+ for (const tc of xmlToolCalls) {
64
+ toolCalls.push(tc);
65
+ callbacks.onToolCall?.(tc);
66
+ }
67
+ }
68
+
69
+ return {toolCalls, cleanedContent};
70
+ }
@@ -0,0 +1,220 @@
1
+ import test from 'ava';
2
+ import type {Message} from '@/types/index';
3
+ import {convertToModelMessages, isEmptyAssistantMessage} from './message-converter.js';
4
+ import type {TestableMessage} from '../types.js';
5
+
6
+ test('isEmptyAssistantMessage returns false for non-assistant messages', t => {
7
+ const message: TestableMessage = {
8
+ role: 'user',
9
+ content: '',
10
+ };
11
+ t.false(isEmptyAssistantMessage(message));
12
+ });
13
+
14
+ test('isEmptyAssistantMessage returns true for empty assistant message with string content', t => {
15
+ const message: TestableMessage = {
16
+ role: 'assistant',
17
+ content: '',
18
+ };
19
+ t.true(isEmptyAssistantMessage(message));
20
+ });
21
+
22
+ test('isEmptyAssistantMessage returns true for empty assistant message with whitespace', t => {
23
+ const message: TestableMessage = {
24
+ role: 'assistant',
25
+ content: ' ',
26
+ };
27
+ t.true(isEmptyAssistantMessage(message));
28
+ });
29
+
30
+ test('isEmptyAssistantMessage returns true for empty assistant message with empty array content', t => {
31
+ const message: TestableMessage = {
32
+ role: 'assistant',
33
+ content: [],
34
+ };
35
+ t.true(isEmptyAssistantMessage(message));
36
+ });
37
+
38
+ test('isEmptyAssistantMessage returns false for assistant message with content', t => {
39
+ const message: TestableMessage = {
40
+ role: 'assistant',
41
+ content: 'Hello',
42
+ };
43
+ t.false(isEmptyAssistantMessage(message));
44
+ });
45
+
46
+ test('isEmptyAssistantMessage returns false for assistant message with tool calls', t => {
47
+ const message: TestableMessage = {
48
+ role: 'assistant',
49
+ content: '',
50
+ toolCalls: [{name: 'test', arguments: {}}],
51
+ };
52
+ t.false(isEmptyAssistantMessage(message));
53
+ });
54
+
55
+ test('convertToModelMessages converts system message', t => {
56
+ const messages: Message[] = [
57
+ {
58
+ role: 'system',
59
+ content: 'You are a helpful assistant',
60
+ },
61
+ ];
62
+
63
+ const result = convertToModelMessages(messages);
64
+ t.is(result.length, 1);
65
+ t.is(result[0].role, 'system');
66
+ t.is(result[0].content, 'You are a helpful assistant');
67
+ });
68
+
69
+ test('convertToModelMessages converts user message', t => {
70
+ const messages: Message[] = [
71
+ {
72
+ role: 'user',
73
+ content: 'Hello',
74
+ },
75
+ ];
76
+
77
+ const result = convertToModelMessages(messages);
78
+ t.is(result.length, 1);
79
+ t.is(result[0].role, 'user');
80
+ t.is(result[0].content, 'Hello');
81
+ });
82
+
83
+ test('convertToModelMessages converts assistant message with text', t => {
84
+ const messages: Message[] = [
85
+ {
86
+ role: 'assistant',
87
+ content: 'Hi there',
88
+ },
89
+ ];
90
+
91
+ const result = convertToModelMessages(messages);
92
+ t.is(result.length, 1);
93
+ t.is(result[0].role, 'assistant');
94
+ t.true(Array.isArray(result[0].content));
95
+ const content = result[0].content as Array<{type: string; text?: string}>;
96
+ t.is(content.length, 1);
97
+ t.is(content[0].type, 'text');
98
+ t.is(content[0].text, 'Hi there');
99
+ });
100
+
101
+ test('convertToModelMessages converts assistant message with tool calls', t => {
102
+ const messages: Message[] = [
103
+ {
104
+ role: 'assistant',
105
+ content: '',
106
+ tool_calls: [
107
+ {
108
+ id: 'call_123',
109
+ function: {
110
+ name: 'test_tool',
111
+ arguments: {arg: 'value'},
112
+ },
113
+ },
114
+ ],
115
+ },
116
+ ];
117
+
118
+ const result = convertToModelMessages(messages);
119
+ t.is(result.length, 1);
120
+ t.is(result[0].role, 'assistant');
121
+ t.true(Array.isArray(result[0].content));
122
+ const content = result[0].content as Array<{
123
+ type: string;
124
+ toolCallId?: string;
125
+ toolName?: string;
126
+ input?: unknown;
127
+ }>;
128
+ t.is(content.length, 1);
129
+ t.is(content[0].type, 'tool-call');
130
+ t.is(content[0].toolCallId, 'call_123');
131
+ t.is(content[0].toolName, 'test_tool');
132
+ t.deepEqual(content[0].input, {arg: 'value'});
133
+ });
134
+
135
+ test('convertToModelMessages converts assistant message with both text and tool calls', t => {
136
+ const messages: Message[] = [
137
+ {
138
+ role: 'assistant',
139
+ content: 'Let me help',
140
+ tool_calls: [
141
+ {
142
+ id: 'call_123',
143
+ function: {
144
+ name: 'test_tool',
145
+ arguments: {},
146
+ },
147
+ },
148
+ ],
149
+ },
150
+ ];
151
+
152
+ const result = convertToModelMessages(messages);
153
+ t.is(result.length, 1);
154
+ t.is(result[0].role, 'assistant');
155
+ t.true(Array.isArray(result[0].content));
156
+ const content = result[0].content as Array<{type: string}>;
157
+ t.is(content.length, 2);
158
+ t.is(content[0].type, 'text');
159
+ t.is(content[1].type, 'tool-call');
160
+ });
161
+
162
+ test('convertToModelMessages converts empty assistant message to message with empty text', t => {
163
+ const messages: Message[] = [
164
+ {
165
+ role: 'assistant',
166
+ content: '',
167
+ },
168
+ ];
169
+
170
+ const result = convertToModelMessages(messages);
171
+ t.is(result.length, 1);
172
+ t.is(result[0].role, 'assistant');
173
+ t.true(Array.isArray(result[0].content));
174
+ const content = result[0].content as Array<{type: string; text?: string}>;
175
+ t.is(content.length, 1);
176
+ t.is(content[0].type, 'text');
177
+ t.is(content[0].text, '');
178
+ });
179
+
180
+ test('convertToModelMessages converts tool message', t => {
181
+ const messages: Message[] = [
182
+ {
183
+ role: 'tool',
184
+ content: 'Tool result',
185
+ tool_call_id: 'call_123',
186
+ name: 'test_tool',
187
+ },
188
+ ];
189
+
190
+ const result = convertToModelMessages(messages);
191
+ t.is(result.length, 1);
192
+ t.is(result[0].role, 'tool');
193
+ t.true(Array.isArray(result[0].content));
194
+ const content = result[0].content as Array<{
195
+ type: string;
196
+ toolCallId?: string;
197
+ toolName?: string;
198
+ output?: {type: string; value: string};
199
+ }>;
200
+ t.is(content.length, 1);
201
+ t.is(content[0].type, 'tool-result');
202
+ t.is(content[0].toolCallId, 'call_123');
203
+ t.is(content[0].toolName, 'test_tool');
204
+ t.is(content[0].output?.type, 'text');
205
+ t.is(content[0].output?.value, 'Tool result');
206
+ });
207
+
208
+ test('convertToModelMessages handles multiple messages', t => {
209
+ const messages: Message[] = [
210
+ {role: 'system', content: 'System'},
211
+ {role: 'user', content: 'User'},
212
+ {role: 'assistant', content: 'Assistant'},
213
+ ];
214
+
215
+ const result = convertToModelMessages(messages);
216
+ t.is(result.length, 3);
217
+ t.is(result[0].role, 'system');
218
+ t.is(result[1].role, 'user');
219
+ t.is(result[2].role, 'assistant');
220
+ });
@@ -0,0 +1,113 @@
1
+ import type {Message} from '@/types/index';
2
+ import type {AssistantContent, ModelMessage, TextPart, ToolCallPart} from 'ai';
3
+ import type {TestableMessage} from '../types.js';
4
+
5
+ /**
6
+ * Checks if an assistant message is empty (no content and no tool calls).
7
+ * Empty assistant messages cause API errors:
8
+ * "400 Bad Request: Assistant message must have either content or tool_calls, but not none."
9
+ *
10
+ * Exported for testing purposes.
11
+ */
12
+ export function isEmptyAssistantMessage(message: TestableMessage): boolean {
13
+ if (message.role !== 'assistant') {
14
+ return false;
15
+ }
16
+ // Check for content - handle both string and array content formats
17
+ const hasContent = Array.isArray(message.content)
18
+ ? message.content.length > 0
19
+ : typeof message.content === 'string' && message.content.trim().length > 0;
20
+ // Tool calls are in a separate property for AI SDK messages
21
+ const hasToolCalls =
22
+ 'toolCalls' in message &&
23
+ Array.isArray(message.toolCalls) &&
24
+ message.toolCalls.length > 0;
25
+ return !hasContent && !hasToolCalls;
26
+ }
27
+
28
+ /**
29
+ * Convert our Message format to AI SDK v6 ModelMessage format
30
+ *
31
+ * Tool messages: Converted to AI SDK tool-result format with proper structure.
32
+ */
33
+ export function convertToModelMessages(messages: Message[]): ModelMessage[] {
34
+ return messages.map((msg): ModelMessage => {
35
+ if (msg.role === 'tool') {
36
+ // Convert to AI SDK tool-result format
37
+ // AI SDK expects: { role: 'tool', content: [{ type: 'tool-result', toolCallId, toolName, output }] }
38
+ // where output is { type: 'text', value: string } or { type: 'json', value: JSONValue }
39
+ return {
40
+ role: 'tool',
41
+ content: [
42
+ {
43
+ type: 'tool-result',
44
+ toolCallId: msg.tool_call_id || '',
45
+ toolName: msg.name || '',
46
+ output: {
47
+ type: 'text',
48
+ value: msg.content,
49
+ },
50
+ },
51
+ ],
52
+ };
53
+ }
54
+
55
+ if (msg.role === 'system') {
56
+ return {
57
+ role: 'system',
58
+ content: msg.content,
59
+ };
60
+ }
61
+
62
+ if (msg.role === 'user') {
63
+ return {
64
+ role: 'user',
65
+ content: msg.content,
66
+ };
67
+ }
68
+
69
+ if (msg.role === 'assistant') {
70
+ // Build content array
71
+ const content: AssistantContent = [];
72
+
73
+ // Add text content if present
74
+ if (msg.content) {
75
+ content.push({
76
+ type: 'text',
77
+ text: msg.content,
78
+ } as TextPart);
79
+ }
80
+
81
+ // Add tool calls if present (for auto-executed messages)
82
+ if (msg.tool_calls && msg.tool_calls.length > 0) {
83
+ for (const toolCall of msg.tool_calls) {
84
+ content.push({
85
+ type: 'tool-call',
86
+ toolCallId: toolCall.id,
87
+ toolName: toolCall.function.name,
88
+ input: toolCall.function.arguments,
89
+ } as ToolCallPart);
90
+ }
91
+ }
92
+
93
+ // If no content at all, add empty text to avoid empty message
94
+ if (content.length === 0) {
95
+ content.push({
96
+ type: 'text',
97
+ text: '',
98
+ } as TextPart);
99
+ }
100
+
101
+ return {
102
+ role: 'assistant',
103
+ content,
104
+ };
105
+ }
106
+
107
+ // Fallback - should never happen
108
+ return {
109
+ role: 'user',
110
+ content: msg.content,
111
+ };
112
+ });
113
+ }
@@ -0,0 +1,90 @@
1
+ import test from 'ava';
2
+ import {
3
+ convertAISDKToolCall,
4
+ convertAISDKToolCalls,
5
+ generateToolCallId,
6
+ getToolResultOutput,
7
+ } from './tool-converter.js';
8
+
9
+ test('generateToolCallId creates unique IDs', t => {
10
+ const id1 = generateToolCallId();
11
+ const id2 = generateToolCallId();
12
+
13
+ t.true(id1.startsWith('tool_'));
14
+ t.true(id2.startsWith('tool_'));
15
+ t.not(id1, id2);
16
+ });
17
+
18
+ test('convertAISDKToolCall uses provided toolCallId', t => {
19
+ const aiToolCall = {
20
+ toolCallId: 'call_123',
21
+ toolName: 'test_tool',
22
+ input: {arg: 'value'},
23
+ };
24
+
25
+ const result = convertAISDKToolCall(aiToolCall);
26
+
27
+ t.is(result.id, 'call_123');
28
+ t.is(result.function.name, 'test_tool');
29
+ t.deepEqual(result.function.arguments, {arg: 'value'});
30
+ });
31
+
32
+ test('convertAISDKToolCall generates ID when missing', t => {
33
+ const aiToolCall = {
34
+ toolName: 'test_tool',
35
+ input: {arg: 'value'},
36
+ };
37
+
38
+ const result = convertAISDKToolCall(aiToolCall);
39
+
40
+ t.true(result.id.startsWith('tool_'));
41
+ t.is(result.function.name, 'test_tool');
42
+ t.deepEqual(result.function.arguments, {arg: 'value'});
43
+ });
44
+
45
+ test('convertAISDKToolCalls converts multiple tool calls', t => {
46
+ const aiToolCalls = [
47
+ {
48
+ toolCallId: 'call_1',
49
+ toolName: 'tool_1',
50
+ input: {a: 1},
51
+ },
52
+ {
53
+ toolName: 'tool_2',
54
+ input: {b: 2},
55
+ },
56
+ ];
57
+
58
+ const result = convertAISDKToolCalls(aiToolCalls);
59
+
60
+ t.is(result.length, 2);
61
+ t.is(result[0].id, 'call_1');
62
+ t.is(result[0].function.name, 'tool_1');
63
+ t.true(result[1].id.startsWith('tool_'));
64
+ t.is(result[1].function.name, 'tool_2');
65
+ });
66
+
67
+ test('convertAISDKToolCalls handles empty array', t => {
68
+ const result = convertAISDKToolCalls([]);
69
+ t.deepEqual(result, []);
70
+ });
71
+
72
+ test('getToolResultOutput returns string as-is', t => {
73
+ const result = getToolResultOutput('test output');
74
+ t.is(result, 'test output');
75
+ });
76
+
77
+ test('getToolResultOutput converts object to JSON string', t => {
78
+ const result = getToolResultOutput({key: 'value'});
79
+ t.is(result, '{"key":"value"}');
80
+ });
81
+
82
+ test('getToolResultOutput converts array to JSON string', t => {
83
+ const result = getToolResultOutput([1, 2, 3]);
84
+ t.is(result, '[1,2,3]');
85
+ });
86
+
87
+ test('getToolResultOutput converts number to JSON string', t => {
88
+ const result = getToolResultOutput(42);
89
+ t.is(result, '42');
90
+ });
@@ -0,0 +1,46 @@
1
+ import {randomBytes} from 'node:crypto';
2
+ import type {ToolCall} from '@/types/index';
3
+
4
+ /**
5
+ * Generates a unique tool call ID
6
+ */
7
+ export function generateToolCallId(): string {
8
+ return `tool_${Date.now()}_${randomBytes(8).toString('hex')}`;
9
+ }
10
+
11
+ /**
12
+ * Converts AI SDK tool call format to our ToolCall format
13
+ */
14
+ export function convertAISDKToolCall(toolCall: {
15
+ toolCallId?: string;
16
+ toolName: string;
17
+ input: unknown;
18
+ }): ToolCall {
19
+ return {
20
+ id: toolCall.toolCallId || generateToolCallId(),
21
+ function: {
22
+ name: toolCall.toolName,
23
+ arguments: toolCall.input as Record<string, unknown>,
24
+ },
25
+ };
26
+ }
27
+
28
+ /**
29
+ * Converts multiple AI SDK tool calls to our ToolCall format
30
+ */
31
+ export function convertAISDKToolCalls(
32
+ toolCalls: Array<{
33
+ toolCallId?: string;
34
+ toolName: string;
35
+ input: unknown;
36
+ }>,
37
+ ): ToolCall[] {
38
+ return toolCalls.map(convertAISDKToolCall);
39
+ }
40
+
41
+ /**
42
+ * Gets the tool result output as a string
43
+ */
44
+ export function getToolResultOutput(output: unknown): string {
45
+ return typeof output === 'string' ? output : JSON.stringify(output);
46
+ }
@@ -0,0 +1,55 @@
1
+ import test from 'ava';
2
+ import {RetryError} from 'ai';
3
+ import {extractRootError} from './error-extractor.js';
4
+
5
+ test('extractRootError returns error unchanged if not a RetryError', t => {
6
+ const error = new Error('Test error');
7
+ const result = extractRootError(error);
8
+ t.is(result, error);
9
+ });
10
+
11
+ test('extractRootError extracts lastError from RetryError', t => {
12
+ const rootError = new Error('Root cause');
13
+ const retryError = new RetryError({
14
+ message: 'Retry failed',
15
+ reason: 'maxRetriesExceeded',
16
+ errors: [rootError],
17
+ });
18
+
19
+ const result = extractRootError(retryError);
20
+ t.is(result, rootError);
21
+ });
22
+
23
+ test('extractRootError handles nested RetryErrors', t => {
24
+ const rootError = new Error('Root cause');
25
+ const innerRetryError = new RetryError({
26
+ message: 'Inner retry failed',
27
+ reason: 'maxRetriesExceeded',
28
+ errors: [rootError],
29
+ });
30
+ const outerRetryError = new RetryError({
31
+ message: 'Outer retry failed',
32
+ reason: 'maxRetriesExceeded',
33
+ errors: [innerRetryError],
34
+ });
35
+
36
+ const result = extractRootError(outerRetryError);
37
+ t.is(result, rootError);
38
+ });
39
+
40
+ test('extractRootError handles RetryError with no lastError', t => {
41
+ const retryError = new RetryError({
42
+ message: 'Retry failed',
43
+ reason: 'maxRetriesExceeded',
44
+ errors: [],
45
+ });
46
+
47
+ const result = extractRootError(retryError);
48
+ t.is(result, retryError);
49
+ });
50
+
51
+ test('extractRootError handles non-Error values', t => {
52
+ const nonError = 'string error';
53
+ const result = extractRootError(nonError);
54
+ t.is(result, nonError);
55
+ });
@@ -0,0 +1,15 @@
1
+ import {RetryError} from 'ai';
2
+
3
+ /**
4
+ * Extracts the root cause error from AI SDK error wrappers.
5
+ * AI SDK wraps errors in RetryError which contains lastError.
6
+ */
7
+ export function extractRootError(error: unknown): unknown {
8
+ // Handle AI SDK RetryError - extract the last error
9
+ if (RetryError.isInstance(error)) {
10
+ if (error.lastError) {
11
+ return extractRootError(error.lastError);
12
+ }
13
+ }
14
+ return error;
15
+ }