@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,157 @@
1
+ #!/usr/bin/env bash
2
+ # Update Nix package version and hashes for a new release
3
+ # Usage: ./scripts/update-nix-version.sh <version>
4
+ # Example: ./scripts/update-nix-version.sh 1.15.0
5
+
6
+ set -e
7
+
8
+ VERSION=$1
9
+ SKIP_VERIFY=$2
10
+ NIX_FILE="nix/packages/default/default.nix"
11
+ FAKE_HASH="sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
12
+
13
+ # Color codes for output
14
+ RED='\033[0;31m'
15
+ GREEN='\033[0;32m'
16
+ YELLOW='\033[1;33m'
17
+ NC='\033[0m' # No Color
18
+
19
+ if [ -z "$VERSION" ]; then
20
+ echo -e "${RED}Error: Version number required${NC}"
21
+ echo "Usage: $0 <version> [--skip-verify]"
22
+ echo "Example: $0 1.15.0"
23
+ echo "Example: $0 1.15.0 --skip-verify"
24
+ exit 1
25
+ fi
26
+
27
+ echo -e "${YELLOW}Updating Nix package to version ${VERSION}...${NC}"
28
+ echo ""
29
+
30
+ # Step 1: Update version in nix file
31
+ echo "Step 1: Updating version number in ${NIX_FILE}..."
32
+ if [[ "$OSTYPE" == "darwin"* ]]; then
33
+ sed -i '' "s|version = \".*\";|version = \"${VERSION}\";|" "$NIX_FILE"
34
+ else
35
+ sed -i "s|version = \".*\";|version = \"${VERSION}\";|" "$NIX_FILE"
36
+ fi
37
+
38
+ # Step 2: Insert fake source hash
39
+ echo "Step 2: Using fake source hash to trigger hash calculation..."
40
+ if [[ "$OSTYPE" == "darwin"* ]]; then
41
+ sed -i '' "s|sha256 = \".*\";|sha256 = \"${FAKE_HASH}\";|" "$NIX_FILE"
42
+ else
43
+ sed -i "s|sha256 = \".*\";|sha256 = \"${FAKE_HASH}\";|" "$NIX_FILE"
44
+ fi
45
+
46
+ # Step 3: Build to get the real source hash
47
+ echo "Step 3: Building package to get correct source hash..."
48
+ echo -e "${YELLOW}(This will fail - that's expected!)${NC}"
49
+ echo ""
50
+
51
+ BUILD_OUTPUT=$(nix build .#default 2>&1 || true)
52
+ SOURCE_HASH=$(echo "$BUILD_OUTPUT" | sed -n 's/.*got:[[:space:]]*\(sha256-[A-Za-z0-9+/=]*\).*/\1/p' | head -1)
53
+
54
+ if [ -z "$SOURCE_HASH" ]; then
55
+ echo -e "${RED}Error: Could not extract source hash from build output${NC}"
56
+ echo "Build output:"
57
+ echo "$BUILD_OUTPUT"
58
+ exit 1
59
+ fi
60
+
61
+ echo -e "${GREEN}Found source hash: ${SOURCE_HASH}${NC}"
62
+ echo ""
63
+
64
+ # Step 4: Update with real source hash
65
+ echo "Step 4: Updating with correct source hash..."
66
+ if [[ "$OSTYPE" == "darwin"* ]]; then
67
+ sed -i '' "s|sha256 = \".*\";|sha256 = \"${SOURCE_HASH}\";|" "$NIX_FILE"
68
+ else
69
+ sed -i "s|sha256 = \".*\";|sha256 = \"${SOURCE_HASH}\";|" "$NIX_FILE"
70
+ fi
71
+
72
+ # Step 5: Insert fake pnpmDeps hash
73
+ echo "Step 5: Using fake pnpmDeps hash to trigger hash calculation..."
74
+ if [[ "$OSTYPE" == "darwin"* ]]; then
75
+ sed -i '' "s|hash = \".*\";|hash = \"${FAKE_HASH}\";|" "$NIX_FILE"
76
+ else
77
+ sed -i "s|hash = \".*\";|hash = \"${FAKE_HASH}\";|" "$NIX_FILE"
78
+ fi
79
+
80
+ # Step 6: Build to get the real pnpmDeps hash
81
+ echo "Step 6: Building package to get correct pnpmDeps hash..."
82
+ echo -e "${YELLOW}(This will fail - that's expected!)${NC}"
83
+ echo ""
84
+
85
+ BUILD_OUTPUT=$(nix build .#default 2>&1 || true)
86
+ PNPM_HASH=$(echo "$BUILD_OUTPUT" | sed -n 's/.*got:[[:space:]]*\(sha256-[A-Za-z0-9+/=]*\).*/\1/p' | head -1)
87
+
88
+ if [ -z "$PNPM_HASH" ]; then
89
+ echo -e "${RED}Error: Could not extract pnpmDeps hash from build output${NC}"
90
+ echo "Build output:"
91
+ echo "$BUILD_OUTPUT"
92
+ exit 1
93
+ fi
94
+
95
+ echo -e "${GREEN}Found pnpmDeps hash: ${PNPM_HASH}${NC}"
96
+ echo ""
97
+
98
+ # Step 7: Update with real pnpmDeps hash
99
+ echo "Step 7: Updating with correct pnpmDeps hash..."
100
+ if [[ "$OSTYPE" == "darwin"* ]]; then
101
+ sed -i '' "s|hash = \".*\";|hash = \"${PNPM_HASH}\";|" "$NIX_FILE"
102
+ else
103
+ sed -i "s|hash = \".*\";|hash = \"${PNPM_HASH}\";|" "$NIX_FILE"
104
+ fi
105
+
106
+ # Step 8: Build again to verify (unless --skip-verify is passed)
107
+ if [ "$SKIP_VERIFY" = "--skip-verify" ]; then
108
+ echo "Step 8: Skipping verification build (--skip-verify flag passed)"
109
+ echo ""
110
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
111
+ echo -e "${GREEN}Success! Nix package updated to v${VERSION}${NC}"
112
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
113
+ echo ""
114
+ echo "Changes made to: ${NIX_FILE}"
115
+ echo ""
116
+ echo "Source hash: ${SOURCE_HASH}"
117
+ echo "pnpmDeps hash: ${PNPM_HASH}"
118
+ echo ""
119
+ echo -e "${YELLOW}Note: Verification build was skipped. Run 'nix build .#default' locally to verify.${NC}"
120
+ else
121
+ echo "Step 8: Verifying build with correct hashes..."
122
+ if nix build .#default; then
123
+ echo -e "${GREEN}✓ Build successful!${NC}"
124
+ echo ""
125
+
126
+ # Test the binary exists
127
+ echo "Step 9: Verifying binary exists..."
128
+ if [ -f "./result/bin/coder" ] && [ -x "./result/bin/coder" ]; then
129
+ echo -e "${GREEN}✓ Binary exists and is executable!${NC}"
130
+ else
131
+ echo -e "${YELLOW}⚠ Warning: Binary not found or not executable${NC}"
132
+ fi
133
+
134
+ # Clean up
135
+ rm -f result
136
+
137
+ echo ""
138
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
139
+ echo -e "${GREEN}Success! Nix package updated to v${VERSION}${NC}"
140
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
141
+ echo ""
142
+ echo "Changes made to: ${NIX_FILE}"
143
+ echo ""
144
+ echo "Source hash: ${SOURCE_HASH}"
145
+ echo "pnpmDeps hash: ${PNPM_HASH}"
146
+ echo ""
147
+ echo "Next steps:"
148
+ echo " 1. Review the changes: git diff ${NIX_FILE}"
149
+ echo " 2. Commit: git add ${NIX_FILE}"
150
+ echo " 3. Commit: git commit -m 'chore: update nix package to v${VERSION}'"
151
+ echo " 4. Push: git push"
152
+ else
153
+ echo -e "${RED}✗ Build failed with correct hashes${NC}"
154
+ echo "Please check the build output above for errors."
155
+ exit 1
156
+ fi
157
+ fi
@@ -0,0 +1,117 @@
1
+ import test from 'ava';
2
+ import type {AIProviderConfig} from '@/types/index';
3
+ import {AISDKClient} from './AISDKClient.js';
4
+
5
+ test('AISDKClient constructor initializes with config', t => {
6
+ const config: AIProviderConfig = {
7
+ name: 'TestProvider',
8
+ type: 'openai',
9
+ models: ['test-model-1', 'test-model-2'],
10
+ config: {
11
+ baseURL: 'https://api.test.com',
12
+ apiKey: 'test-key',
13
+ },
14
+ };
15
+
16
+ const client = new AISDKClient(config);
17
+
18
+ t.is(client.getCurrentModel(), 'test-model-1');
19
+ t.is(client.getContextSize(), 0); // Not yet loaded
20
+ t.is(client.getMaxRetries(), 2); // Default value
21
+ });
22
+
23
+ test('AISDKClient.create returns a Promise', async t => {
24
+ const config: AIProviderConfig = {
25
+ name: 'TestProvider',
26
+ type: 'openai',
27
+ models: ['test-model'],
28
+ config: {
29
+ baseURL: 'https://api.test.com',
30
+ apiKey: 'test-key',
31
+ },
32
+ };
33
+
34
+ const client = await AISDKClient.create(config);
35
+
36
+ t.truthy(client);
37
+ t.true(client instanceof AISDKClient);
38
+ });
39
+
40
+ test('AISDKClient setModel updates current model', t => {
41
+ const config: AIProviderConfig = {
42
+ name: 'TestProvider',
43
+ type: 'openai',
44
+ models: ['model-1', 'model-2'],
45
+ config: {
46
+ baseURL: 'https://api.test.com',
47
+ },
48
+ };
49
+
50
+ const client = new AISDKClient(config);
51
+ t.is(client.getCurrentModel(), 'model-1');
52
+
53
+ client.setModel('model-2');
54
+ t.is(client.getCurrentModel(), 'model-2');
55
+ });
56
+
57
+ test('AISDKClient getAvailableModels returns models array', async t => {
58
+ const config: AIProviderConfig = {
59
+ name: 'TestProvider',
60
+ type: 'openai',
61
+ models: ['model-1', 'model-2', 'model-3'],
62
+ config: {
63
+ baseURL: 'https://api.test.com',
64
+ },
65
+ };
66
+
67
+ const client = new AISDKClient(config);
68
+ const models = await client.getAvailableModels();
69
+
70
+ t.deepEqual(models, ['model-1', 'model-2', 'model-3']);
71
+ });
72
+
73
+ test('AISDKClient clearContext resolves successfully', async t => {
74
+ const config: AIProviderConfig = {
75
+ name: 'TestProvider',
76
+ type: 'openai',
77
+ models: ['test-model'],
78
+ config: {
79
+ baseURL: 'https://api.test.com',
80
+ },
81
+ };
82
+
83
+ const client = new AISDKClient(config);
84
+
85
+ await t.notThrowsAsync(async () => {
86
+ await client.clearContext();
87
+ });
88
+ });
89
+
90
+ test('AISDKClient uses custom maxRetries from config', t => {
91
+ const config: AIProviderConfig = {
92
+ name: 'TestProvider',
93
+ type: 'openai',
94
+ models: ['test-model'],
95
+ maxRetries: 5,
96
+ config: {
97
+ baseURL: 'https://api.test.com',
98
+ },
99
+ };
100
+
101
+ const client = new AISDKClient(config);
102
+ t.is(client.getMaxRetries(), 5);
103
+ });
104
+
105
+ test('AISDKClient handles config without models', t => {
106
+ const config: AIProviderConfig = {
107
+ name: 'TestProvider',
108
+ type: 'openai',
109
+ models: [],
110
+ config: {
111
+ baseURL: 'https://api.test.com',
112
+ },
113
+ };
114
+
115
+ const client = new AISDKClient(config);
116
+ t.is(client.getCurrentModel(), '');
117
+ });
@@ -0,0 +1,155 @@
1
+ import {TIMEOUT_SOCKET_DEFAULT_MS} from '@/constants';
2
+ import {getModelContextLimit} from '@/models/index.js';
3
+ import type {
4
+ AIProviderConfig,
5
+ AISDKCoreTool,
6
+ LLMChatResponse,
7
+ LLMClient,
8
+ Message,
9
+ StreamCallbacks,
10
+ } from '@/types/index';
11
+ import {getLogger} from '@/utils/logging';
12
+ import {createOpenAICompatible} from '@ai-sdk/openai-compatible';
13
+ import type {LanguageModel} from 'ai';
14
+ import {Agent} from 'undici';
15
+ import {handleChat} from './chat/chat-handler.js';
16
+ import {createProvider} from './providers/provider-factory.js';
17
+
18
+ export class AISDKClient implements LLMClient {
19
+ private provider: ReturnType<typeof createOpenAICompatible>;
20
+ private currentModel: string;
21
+ private availableModels: string[];
22
+ private providerConfig: AIProviderConfig;
23
+ private undiciAgent: Agent;
24
+ private cachedContextSize: number;
25
+ private maxRetries: number;
26
+
27
+ constructor(providerConfig: AIProviderConfig) {
28
+ const logger = getLogger();
29
+
30
+ this.providerConfig = providerConfig;
31
+ this.availableModels = providerConfig.models;
32
+ this.currentModel = providerConfig.models[0] || '';
33
+ this.cachedContextSize = 0;
34
+ // Default to 2 retries (same as AI SDK default), or use configured value
35
+ this.maxRetries = providerConfig.maxRetries ?? 2;
36
+
37
+ logger.info('AI SDK client initializing', {
38
+ models: this.availableModels,
39
+ defaultModel: this.currentModel,
40
+ provider: providerConfig.name || 'unknown',
41
+ baseUrl: providerConfig.config.baseURL ? '[REDACTED]' : undefined,
42
+ maxRetries: this.maxRetries,
43
+ });
44
+
45
+ const {connectionPool} = this.providerConfig;
46
+ const {requestTimeout, socketTimeout} = this.providerConfig;
47
+ const effectiveSocketTimeout = socketTimeout ?? requestTimeout;
48
+ const resolvedSocketTimeout =
49
+ effectiveSocketTimeout === -1
50
+ ? 0
51
+ : (effectiveSocketTimeout ?? TIMEOUT_SOCKET_DEFAULT_MS);
52
+
53
+ this.undiciAgent = new Agent({
54
+ connect: {
55
+ timeout: resolvedSocketTimeout,
56
+ },
57
+ bodyTimeout: resolvedSocketTimeout,
58
+ headersTimeout: resolvedSocketTimeout,
59
+ keepAliveTimeout: connectionPool?.idleTimeout,
60
+ keepAliveMaxTimeout: connectionPool?.cumulativeMaxIdleTimeout,
61
+ });
62
+
63
+ this.provider = createProvider(this.providerConfig, this.undiciAgent);
64
+
65
+ // Fetch context size asynchronously (don't block construction)
66
+ void this.updateContextSize();
67
+ }
68
+
69
+ /**
70
+ * Fetch and cache context size from models.dev
71
+ */
72
+ private async updateContextSize(): Promise<void> {
73
+ try {
74
+ const contextSize = await getModelContextLimit(this.currentModel);
75
+ this.cachedContextSize = contextSize || 0;
76
+ } catch {
77
+ // Silently fail - context size will remain 0
78
+ this.cachedContextSize = 0;
79
+ }
80
+ }
81
+
82
+ static create(providerConfig: AIProviderConfig): Promise<AISDKClient> {
83
+ const client = new AISDKClient(providerConfig);
84
+ return Promise.resolve(client);
85
+ }
86
+
87
+ setModel(model: string): void {
88
+ const logger = getLogger();
89
+ const previousModel = this.currentModel;
90
+
91
+ this.currentModel = model;
92
+
93
+ logger.info('Model changed', {
94
+ previousModel,
95
+ newModel: model,
96
+ provider: this.providerConfig.name,
97
+ });
98
+
99
+ // Update context size when model changes
100
+ void this.updateContextSize();
101
+ }
102
+
103
+ getCurrentModel(): string {
104
+ return this.currentModel;
105
+ }
106
+
107
+ getContextSize(): number {
108
+ return this.cachedContextSize;
109
+ }
110
+
111
+ getMaxRetries(): number {
112
+ return this.maxRetries;
113
+ }
114
+
115
+ getAvailableModels(): Promise<string[]> {
116
+ return Promise.resolve(this.availableModels);
117
+ }
118
+
119
+ /**
120
+ * Stream chat with real-time token updates
121
+ */
122
+ async chat(
123
+ messages: Message[],
124
+ tools: Record<string, AISDKCoreTool>,
125
+ callbacks: StreamCallbacks,
126
+ signal?: AbortSignal,
127
+ ): Promise<LLMChatResponse> {
128
+ // Get the language model instance from the provider
129
+ const model = this.provider(this.currentModel) as unknown as LanguageModel;
130
+
131
+ // Delegate to chat handler
132
+ return await handleChat({
133
+ model,
134
+ currentModel: this.currentModel,
135
+ providerConfig: this.providerConfig,
136
+ messages,
137
+ tools,
138
+ callbacks,
139
+ signal,
140
+ maxRetries: this.maxRetries,
141
+ });
142
+ }
143
+
144
+ clearContext(): Promise<void> {
145
+ const logger = getLogger();
146
+
147
+ logger.debug('AI SDK client context cleared', {
148
+ model: this.currentModel,
149
+ provider: this.providerConfig.name,
150
+ });
151
+
152
+ // No internal state to clear
153
+ return Promise.resolve();
154
+ }
155
+ }
@@ -0,0 +1,121 @@
1
+ import test from 'ava';
2
+ import type {
3
+ AIProviderConfig,
4
+ AISDKCoreTool,
5
+ Message,
6
+ StreamCallbacks,
7
+ } from '@/types/index';
8
+ import type {LanguageModel} from 'ai';
9
+ import type {ChatHandlerParams} from './chat-handler.js';
10
+
11
+ // Note: This file contains basic structure tests
12
+ // Full integration tests would require mocking the AI SDK's generateText function
13
+ // which is complex and better tested through the full AISDKClient
14
+
15
+ test('ChatHandlerParams has correct structure', t => {
16
+ const params: ChatHandlerParams = {
17
+ model: {} as LanguageModel,
18
+ currentModel: 'test-model',
19
+ providerConfig: {
20
+ name: 'TestProvider',
21
+ type: 'openai',
22
+ models: ['test-model'],
23
+ config: {
24
+ baseURL: 'https://api.test.com',
25
+ apiKey: 'test-key',
26
+ },
27
+ },
28
+ messages: [],
29
+ tools: {},
30
+ callbacks: {},
31
+ maxRetries: 2,
32
+ };
33
+
34
+ t.is(params.currentModel, 'test-model');
35
+ t.is(params.providerConfig.name, 'TestProvider');
36
+ t.deepEqual(params.messages, []);
37
+ t.deepEqual(params.tools, {});
38
+ });
39
+
40
+ test('ChatHandlerParams accepts optional signal', t => {
41
+ const controller = new AbortController();
42
+ const params: ChatHandlerParams = {
43
+ model: {} as LanguageModel,
44
+ currentModel: 'test-model',
45
+ providerConfig: {
46
+ name: 'TestProvider',
47
+ type: 'openai',
48
+ models: ['test-model'],
49
+ config: {
50
+ baseURL: 'https://api.test.com',
51
+ },
52
+ },
53
+ messages: [],
54
+ tools: {},
55
+ callbacks: {},
56
+ signal: controller.signal,
57
+ maxRetries: 2,
58
+ };
59
+
60
+ t.is(params.signal, controller.signal);
61
+ });
62
+
63
+ test('ChatHandlerParams accepts messages and tools', t => {
64
+ const messages: Message[] = [
65
+ {role: 'user', content: 'Hello'},
66
+ ];
67
+ const tools: Record<string, AISDKCoreTool> = {
68
+ test_tool: {} as AISDKCoreTool,
69
+ };
70
+
71
+ const params: ChatHandlerParams = {
72
+ model: {} as LanguageModel,
73
+ currentModel: 'test-model',
74
+ providerConfig: {
75
+ name: 'TestProvider',
76
+ type: 'openai',
77
+ models: ['test-model'],
78
+ config: {
79
+ baseURL: 'https://api.test.com',
80
+ },
81
+ },
82
+ messages,
83
+ tools,
84
+ callbacks: {},
85
+ maxRetries: 2,
86
+ };
87
+
88
+ t.is(params.messages.length, 1);
89
+ t.is(Object.keys(params.tools).length, 1);
90
+ });
91
+
92
+ test('ChatHandlerParams accepts callbacks', t => {
93
+ const callbacks: StreamCallbacks = {
94
+ onToken: () => {},
95
+ onToolCall: () => {},
96
+ onToolExecuted: () => {},
97
+ onFinish: () => {},
98
+ };
99
+
100
+ const params: ChatHandlerParams = {
101
+ model: {} as LanguageModel,
102
+ currentModel: 'test-model',
103
+ providerConfig: {
104
+ name: 'TestProvider',
105
+ type: 'openai',
106
+ models: ['test-model'],
107
+ config: {
108
+ baseURL: 'https://api.test.com',
109
+ },
110
+ },
111
+ messages: [],
112
+ tools: {},
113
+ callbacks,
114
+ maxRetries: 2,
115
+ };
116
+
117
+ t.truthy(params.callbacks.onToken);
118
+ t.truthy(params.callbacks.onToolCall);
119
+ t.truthy(params.callbacks.onToolExecuted);
120
+ t.truthy(params.callbacks.onFinish);
121
+ });