@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,154 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { dirname, join } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { substituteEnvVars } from '@/config/env-substitution';
6
+ import { getConfigPath } from '@/config/paths';
7
+ import { loadPreferences } from '@/config/preferences';
8
+ import { defaultTheme, getThemeColors } from '@/config/themes';
9
+ import type { AppConfig, Colors } from '@/types/index';
10
+ import { logError, logWarning } from '@/utils/message-queue';
11
+ import { config as loadEnv } from 'dotenv';
12
+
13
+ // Load .env file from working directory (shell environment takes precedence)
14
+ // Suppress dotenv console output by temporarily redirecting stdout
15
+ const envPath = join(process.cwd(), '.env');
16
+ if (existsSync(envPath)) {
17
+ const originalWrite = process.stdout.write.bind(process.stdout);
18
+ process.stdout.write = () => true;
19
+ try {
20
+ loadEnv({ path: envPath });
21
+ } finally {
22
+ process.stdout.write = originalWrite;
23
+ }
24
+ }
25
+
26
+ // Hold a map of what config files are where
27
+ export const confDirMap: Record<string, string> = {};
28
+
29
+ // Find the closest config file for the requested configuration file
30
+ export function getClosestConfigFile(fileName: string): string {
31
+ try {
32
+ const configDir = getConfigPath();
33
+
34
+ // First, lets check for a working directory config
35
+ const cwdPath = join(process.cwd(), fileName); // nosemgrep
36
+ if (existsSync(cwdPath)) {
37
+ // nosemgrep
38
+ confDirMap[fileName] = cwdPath; // nosemgrep
39
+
40
+ return cwdPath; // nosemgrep
41
+ }
42
+
43
+ // Next lets check the $HOME for a hidden file. This should only be for
44
+ // legacy support
45
+ const homePath = join(homedir(), `.${fileName}`); // nosemgrep
46
+ if (existsSync(homePath)) {
47
+ // nosemgrep
48
+ confDirMap[fileName] = homePath; // nosemgrep
49
+
50
+ return homePath; // nosemgrep
51
+ }
52
+
53
+ // Last, lets look for an user level config.
54
+
55
+ // If the file doesn't exist, create it
56
+ const configPath = join(configDir, fileName); // nosemgrep
57
+ if (!existsSync(configPath)) {
58
+ // nosemgrep
59
+ createDefaultConfFile(configDir, fileName);
60
+ }
61
+
62
+ confDirMap[fileName] = configPath; // nosemgrep
63
+
64
+ return configPath; // nosemgrep
65
+ } catch (error) {
66
+ logError(`Failed to load ${fileName}: ${String(error)}`);
67
+ }
68
+
69
+ // The code should never hit this, but it makes the TS compiler happy.
70
+ return fileName;
71
+ }
72
+
73
+ function createDefaultConfFile(filePath: string, fileName: string): void {
74
+ try {
75
+ // If we cant find any, lets assume this is the first user run, create the
76
+ // correct file and direct the user to configure them correctly,
77
+ const configFilePath = join(filePath, fileName); // nosemgrep
78
+ if (!existsSync(configFilePath)) {
79
+ // nosemgrep
80
+ // Maybe add a better sample config?
81
+ const sampleConfig = {};
82
+
83
+ mkdirSync(filePath, { recursive: true });
84
+ writeFileSync(
85
+ configFilePath, // nosemgrep
86
+ JSON.stringify(sampleConfig, null, 2),
87
+ 'utf-8',
88
+ );
89
+ }
90
+ } catch (error) {
91
+ logError(`Failed to write ${filePath}: ${String(error)}`);
92
+ }
93
+ }
94
+
95
+ // Function to load app configuration from coder.config.json if it exists
96
+ function loadAppConfig(): AppConfig {
97
+ const agentsJsonPath = getClosestConfigFile('coder.config.json');
98
+
99
+ try {
100
+ const rawData = readFileSync(agentsJsonPath, 'utf-8');
101
+ const agentsData = JSON.parse(rawData) as { coder?: AppConfig };
102
+
103
+ // Apply environment variable substitution
104
+ const processedData = substituteEnvVars(agentsData);
105
+
106
+ if (processedData.coder) {
107
+ return {
108
+ providers: processedData.coder.providers ?? [],
109
+ mcpServers: processedData.coder.mcpServers ?? [],
110
+ };
111
+ }
112
+ } catch (error) {
113
+ logWarning(
114
+ `Failed to load coder.config.json: ${error instanceof Error ? error.message : String(error)}`,
115
+ );
116
+ }
117
+
118
+ return {};
119
+ }
120
+
121
+ export let appConfig = loadAppConfig();
122
+
123
+ // Function to reload the app configuration (useful after config file changes)
124
+ export function reloadAppConfig(): void {
125
+ appConfig = loadAppConfig();
126
+ }
127
+
128
+ let cachedColors: Colors | null = null;
129
+
130
+ export function getColors(): Colors {
131
+ if (!cachedColors) {
132
+ const preferences = loadPreferences();
133
+ const selectedTheme = preferences.selectedTheme || defaultTheme;
134
+ cachedColors = getThemeColors(selectedTheme);
135
+ }
136
+ return cachedColors;
137
+ }
138
+
139
+ // Legacy export for backwards compatibility - use a getter to avoid circular dependency
140
+ export const colors = new Proxy({} as Colors, {
141
+ get(_target, prop) {
142
+ return getColors()[prop as keyof Colors];
143
+ },
144
+ });
145
+
146
+ // Get the package root directory (where this module is installed)
147
+ const __filename = fileURLToPath(import.meta.url);
148
+ const __dirname = dirname(__filename);
149
+ // Go up from dist/config to package root, then to source/app/prompts/main-prompt.md
150
+ // This works because source/app/prompts/main-prompt.md is included in the package.json files array
151
+ export const promptPath = join(
152
+ __dirname,
153
+ '../../source/app/prompts/main-prompt.md',
154
+ );
@@ -0,0 +1,241 @@
1
+ import * as path from 'path';
2
+ import test from 'ava';
3
+ import {getAppDataPath, getConfigPath} from './paths';
4
+
5
+ // These tests intentionally lock in the public contract for Coder's
6
+ // configuration and data directories. Do not change expected values
7
+ // without providing a migration strategy.
8
+
9
+ console.log(`\npaths.spec.ts`);
10
+
11
+ const ORIGINAL_PLATFORM = process.platform;
12
+ const ORIGINAL_ENV = {...process.env};
13
+
14
+ function setPlatform(platform: NodeJS.Platform) {
15
+ Object.defineProperty(process, 'platform', {
16
+ value: platform,
17
+ configurable: true,
18
+ });
19
+ }
20
+
21
+ function resetEnvironment() {
22
+ for (const key of Object.keys(process.env)) {
23
+ if (!(key in ORIGINAL_ENV)) delete process.env[key];
24
+ }
25
+ for (const [key, value] of Object.entries(ORIGINAL_ENV)) {
26
+ process.env[key] = value as string;
27
+ }
28
+ Object.defineProperty(process, 'platform', {
29
+ value: ORIGINAL_PLATFORM,
30
+ configurable: true,
31
+ });
32
+ }
33
+
34
+ test.afterEach(() => {
35
+ resetEnvironment();
36
+ });
37
+
38
+ function testPathGetter(
39
+ t: import('ava').ExecutionContext,
40
+ platform: NodeJS.Platform,
41
+ env: Record<string, string | undefined>,
42
+ getter: () => string,
43
+ expected: string,
44
+ ) {
45
+ resetEnvironment();
46
+ setPlatform(platform);
47
+ for (const [key, value] of Object.entries(env)) {
48
+ if (value === undefined) delete process.env[key];
49
+ else process.env[key] = value;
50
+ }
51
+ t.is(getter(), expected);
52
+ }
53
+
54
+ // getAppDataPath
55
+
56
+ test.serial('getAppDataPath uses CODER_DATA_DIR override verbatim', t => {
57
+ testPathGetter(
58
+ t,
59
+ 'linux',
60
+ {
61
+ CODER_DATA_DIR: '/custom/data',
62
+ APPDATA: 'C:/Ignored',
63
+ XDG_DATA_HOME: '/ignored',
64
+ },
65
+ getAppDataPath,
66
+ '/custom/data',
67
+ );
68
+ });
69
+
70
+ test.serial('getAppDataPath darwin default path is stable', t => {
71
+ testPathGetter(
72
+ t,
73
+ 'darwin',
74
+ {HOME: '/Users/test'},
75
+ getAppDataPath,
76
+ path.join('/Users/test', 'Library', 'Application Support', 'coder'),
77
+ );
78
+ });
79
+
80
+ test.serial('getAppDataPath win32 uses APPDATA when set', t => {
81
+ testPathGetter(
82
+ t,
83
+ 'win32',
84
+ {APPDATA: path.join('C:', 'Users', 'test', 'AppData', 'Roaming')},
85
+ getAppDataPath,
86
+ path.join('C:', 'Users', 'test', 'AppData', 'Roaming', 'coder'),
87
+ );
88
+ });
89
+
90
+ test.serial(
91
+ 'getAppDataPath win32 falls back to homedir Roaming when APPDATA missing',
92
+ t => {
93
+ testPathGetter(
94
+ t,
95
+ 'win32',
96
+ {APPDATA: undefined, HOME: path.join('C:', 'Users', 'test')},
97
+ getAppDataPath,
98
+ path.join('C:', 'Users', 'test', 'AppData', 'Roaming', 'coder'),
99
+ );
100
+ },
101
+ );
102
+
103
+ test.serial(
104
+ 'getAppDataPath linux honours XDG_DATA_HOME and ignores APPDATA',
105
+ t => {
106
+ testPathGetter(
107
+ t,
108
+ 'linux',
109
+ {XDG_DATA_HOME: '/xdg-data', APPDATA: '/should-not-be-used'},
110
+ getAppDataPath,
111
+ path.join('/xdg-data', 'coder'),
112
+ );
113
+ },
114
+ );
115
+
116
+ test.serial('getAppDataPath linux falls back to ~/.local/share', t => {
117
+ testPathGetter(
118
+ t,
119
+ 'linux',
120
+ {XDG_DATA_HOME: undefined, HOME: '/home/test'},
121
+ getAppDataPath,
122
+ path.join('/home/test', '.local', 'share', 'coder'),
123
+ );
124
+ });
125
+
126
+ test.serial(
127
+ 'getAppDataPath non-standard platform falls back to Linux-style defaults',
128
+ t => {
129
+ testPathGetter(
130
+ t,
131
+ 'freebsd',
132
+ {XDG_DATA_HOME: undefined, HOME: '/home/test'},
133
+ getAppDataPath,
134
+ path.join('/home/test', '.local', 'share', 'coder'),
135
+ );
136
+ },
137
+ );
138
+
139
+ // getConfigPath
140
+
141
+ test.serial('getConfigPath uses CODER_CONFIG_DIR override verbatim', t => {
142
+ testPathGetter(
143
+ t,
144
+ 'linux',
145
+ {
146
+ CODER_CONFIG_DIR: '/custom/config',
147
+ XDG_CONFIG_HOME: '/ignored',
148
+ APPDATA: 'C:/Ignored',
149
+ },
150
+ getConfigPath,
151
+ '/custom/config',
152
+ );
153
+ });
154
+
155
+ test.serial('getConfigPath darwin default path is stable', t => {
156
+ testPathGetter(
157
+ t,
158
+ 'darwin',
159
+ {CODER_CONFIG_DIR: undefined, HOME: '/Users/test'},
160
+ getConfigPath,
161
+ path.join('/Users/test', 'Library', 'Preferences', 'coder'),
162
+ );
163
+ });
164
+
165
+ test.serial('getConfigPath win32 uses APPDATA when set', t => {
166
+ testPathGetter(
167
+ t,
168
+ 'win32',
169
+ {
170
+ CODER_CONFIG_DIR: undefined,
171
+ APPDATA: path.join('C:', 'Users', 'test', 'AppData', 'Roaming'),
172
+ },
173
+ getConfigPath,
174
+ path.join('C:', 'Users', 'test', 'AppData', 'Roaming', 'coder'),
175
+ );
176
+ });
177
+
178
+ test.serial(
179
+ 'getConfigPath win32 falls back to homedir Roaming when APPDATA missing',
180
+ t => {
181
+ testPathGetter(
182
+ t,
183
+ 'win32',
184
+ {
185
+ CODER_CONFIG_DIR: undefined,
186
+ APPDATA: undefined,
187
+ HOME: path.join('C:', 'Users', 'test'),
188
+ },
189
+ getConfigPath,
190
+ path.join('C:', 'Users', 'test', 'AppData', 'Roaming', 'coder'),
191
+ );
192
+ },
193
+ );
194
+
195
+ test.serial(
196
+ 'getConfigPath linux honours XDG_CONFIG_HOME and ignores APPDATA',
197
+ t => {
198
+ testPathGetter(
199
+ t,
200
+ 'linux',
201
+ {
202
+ CODER_CONFIG_DIR: undefined,
203
+ XDG_CONFIG_HOME: '/xdg-config',
204
+ APPDATA: '/should-not-be-used',
205
+ },
206
+ getConfigPath,
207
+ path.join('/xdg-config', 'coder'),
208
+ );
209
+ },
210
+ );
211
+
212
+ test.serial('getConfigPath linux falls back to ~/.config', t => {
213
+ testPathGetter(
214
+ t,
215
+ 'linux',
216
+ {
217
+ CODER_CONFIG_DIR: undefined,
218
+ XDG_CONFIG_HOME: undefined,
219
+ HOME: '/home/test',
220
+ },
221
+ getConfigPath,
222
+ path.join('/home/test', '.config', 'coder'),
223
+ );
224
+ });
225
+
226
+ test.serial(
227
+ 'getConfigPath non-standard platform falls back to Linux-style defaults',
228
+ t => {
229
+ testPathGetter(
230
+ t,
231
+ 'freebsd',
232
+ {
233
+ CODER_CONFIG_DIR: undefined,
234
+ XDG_CONFIG_HOME: undefined,
235
+ HOME: '/home/test',
236
+ },
237
+ getConfigPath,
238
+ path.join('/home/test', '.config', 'coder'),
239
+ );
240
+ },
241
+ );
@@ -0,0 +1,55 @@
1
+ import {homedir} from 'os';
2
+ import {join} from 'path';
3
+
4
+ export function getAppDataPath(): string {
5
+ // Allow explicit override via environment variable
6
+ if (process.env.CODER_DATA_DIR) {
7
+ return process.env.CODER_DATA_DIR;
8
+ }
9
+
10
+ // Check XDG_DATA_HOME first (works cross-platform for testing)
11
+ if (process.env.XDG_DATA_HOME) {
12
+ return join(process.env.XDG_DATA_HOME, 'coder');
13
+ }
14
+
15
+ // Platform-specific app data directories
16
+ let baseAppDataPath: string;
17
+ switch (process.platform) {
18
+ case 'win32': {
19
+ baseAppDataPath =
20
+ process.env.APPDATA ?? join(homedir(), 'AppData', 'Roaming');
21
+ break;
22
+ }
23
+ case 'darwin': {
24
+ baseAppDataPath = join(homedir(), 'Library', 'Application Support');
25
+ break;
26
+ }
27
+ default: {
28
+ baseAppDataPath = join(homedir(), '.local', 'share');
29
+ }
30
+ }
31
+ return join(baseAppDataPath, 'coder');
32
+ }
33
+
34
+ export function getConfigPath(): string {
35
+ // Allow explicit override via environment variable
36
+ if (process.env.CODER_CONFIG_DIR) {
37
+ return process.env.CODER_CONFIG_DIR;
38
+ }
39
+
40
+ // Platform-specific defaults
41
+ let baseConfigPath: string;
42
+ switch (process.platform) {
43
+ case 'win32':
44
+ baseConfigPath =
45
+ process.env.APPDATA ?? join(homedir(), 'AppData', 'Roaming');
46
+ break;
47
+ case 'darwin':
48
+ baseConfigPath = join(homedir(), 'Library', 'Preferences');
49
+ break;
50
+ default:
51
+ baseConfigPath =
52
+ process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');
53
+ }
54
+ return join(baseConfigPath, 'coder');
55
+ }
@@ -0,0 +1,51 @@
1
+ import {readFileSync, writeFileSync} from 'fs';
2
+ import {getClosestConfigFile} from '@/config/index';
3
+ import {logError} from '@/utils/message-queue';
4
+
5
+ import type {UserPreferences} from '@/types/index';
6
+
7
+ let PREFERENCES_PATH: string | null = null;
8
+
9
+ function getPreferencesPath(): string {
10
+ if (!PREFERENCES_PATH) {
11
+ PREFERENCES_PATH = getClosestConfigFile('coder-preferences.json');
12
+ }
13
+ return PREFERENCES_PATH;
14
+ }
15
+
16
+ export function loadPreferences(): UserPreferences {
17
+ try {
18
+ const data = readFileSync(getPreferencesPath(), 'utf-8');
19
+ return JSON.parse(data) as UserPreferences;
20
+ } catch (error) {
21
+ logError(`Failed to load preferences: ${String(error)}`);
22
+ }
23
+ return {};
24
+ }
25
+
26
+ export function savePreferences(preferences: UserPreferences): void {
27
+ try {
28
+ writeFileSync(getPreferencesPath(), JSON.stringify(preferences, null, 2));
29
+ } catch (error) {
30
+ logError(`Failed to save preferences: ${String(error)}`);
31
+ }
32
+ }
33
+
34
+ export function updateLastUsed(provider: string, model: string): void {
35
+ const preferences = loadPreferences();
36
+ preferences.lastProvider = provider;
37
+ preferences.lastModel = model;
38
+
39
+ // Also save the model for this specific provider
40
+ if (!preferences.providerModels) {
41
+ preferences.providerModels = {};
42
+ }
43
+ preferences.providerModels[provider] = model;
44
+
45
+ savePreferences(preferences);
46
+ }
47
+
48
+ export function getLastUsedModel(provider: string): string | undefined {
49
+ const preferences = loadPreferences();
50
+ return preferences.providerModels?.[provider];
51
+ }