@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,514 @@
1
+ /**
2
+ * Pino logger implementation with environment-specific transport support
3
+ */
4
+
5
+ import {existsSync, mkdirSync} from 'fs';
6
+ import {join} from 'path';
7
+ import pino, {type Logger as PinoLogger} from 'pino';
8
+ import {createConfig, getDefaultLogDirectory} from './config.js';
9
+ import {
10
+ formatCorrelationForLog,
11
+ getCurrentCorrelationContext,
12
+ isCorrelationEnabled,
13
+ } from './correlation.js';
14
+ import {createLogMethods} from './log-method-factory.js';
15
+ import {createRedactionRules, redactLogEntry} from './redaction.js';
16
+ import type {
17
+ ConsoleArguments,
18
+ EnvironmentTransportConfig,
19
+ LogLevel,
20
+ Logger,
21
+ LoggerConfig,
22
+ LoggingCliConfig,
23
+ PiiRedactionRules,
24
+ PinoTransportOptions,
25
+ } from './types.js';
26
+
27
+ /**
28
+ * Type guard to check if a value is a Promise
29
+ * Handles void returns properly by checking for specific Promise characteristics
30
+ */
31
+ function isPromise<T>(value: T | Promise<T> | void): value is Promise<T> {
32
+ return (
33
+ value !== null &&
34
+ value !== undefined &&
35
+ typeof value === 'object' &&
36
+ 'then' in value
37
+ );
38
+ }
39
+
40
+ /**
41
+ * Determine transport configuration based on environment and CLI settings
42
+ */
43
+ function determineTransportConfig(
44
+ _isProduction: boolean,
45
+ _isDevelopment: boolean,
46
+ _isTest: boolean,
47
+ _cliConfig?: LoggingCliConfig,
48
+ ): EnvironmentTransportConfig {
49
+ const _envLogFile = process.env.CODER_LOG_TO_FILE === 'true';
50
+ const _envLogConsole = process.env.CODER_LOG_TO_CONSOLE === 'true';
51
+
52
+ // All environments: file only, no console - simplified approach
53
+ return {
54
+ enableFile: true, // Always enable file logging
55
+ enableConsole: false, // Never use console transport
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Create unified logger using file transport for all environments
61
+ */
62
+ function createEnvironmentLogger(
63
+ baseConfig: pino.LoggerOptions,
64
+ transportConfig: EnvironmentTransportConfig,
65
+ ): Logger {
66
+ const logDir = getDefaultLogDirectory();
67
+
68
+ // Create single file transport logger for all environments
69
+ if (transportConfig.enableFile && !transportConfig.enableConsole) {
70
+ // Ensure directory exists
71
+ if (!existsSync(logDir)) {
72
+ mkdirSync(logDir, {recursive: true});
73
+ }
74
+
75
+ // Use Intl.DateTimeFormat for local timezone-aware date formatting
76
+ const now = new Date();
77
+ const localDate = new Intl.DateTimeFormat('en-CA', {
78
+ year: 'numeric',
79
+ month: '2-digit',
80
+ day: '2-digit',
81
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
82
+ })
83
+ .format(now)
84
+ .replace(/\//g, '-');
85
+
86
+ const logFilePath = join(logDir, `coder-${localDate}.log`);
87
+
88
+ const transportOptions: PinoTransportOptions = {
89
+ target: 'pino/file',
90
+ options: {
91
+ destination: logFilePath,
92
+ mkdir: true,
93
+ },
94
+ };
95
+
96
+ const transport = pino.transport(
97
+ transportOptions,
98
+ ) as pino.DestinationStream;
99
+ const pinoLogger = pino(baseConfig, transport);
100
+ const redactionRules = createRedactionRules(
101
+ Array.isArray(baseConfig.redact) ? baseConfig.redact : [],
102
+ true, // Enable email redaction
103
+ true, // Enable user ID redaction
104
+ );
105
+
106
+ return createEnhancedLogger(pinoLogger, undefined, redactionRules);
107
+ }
108
+
109
+ // Silent fallback (should not reach here with new config)
110
+ return createSilentLogger();
111
+ }
112
+
113
+ /**
114
+ * Factory function to create log method with specific level for Pino
115
+ * Uses the shared factory with custom transform logic for redaction and correlation
116
+ * @deprecated Use createLogMethods factory instead
117
+ */
118
+ function _createPinoLogMethod(
119
+ logger: PinoLogger,
120
+ level: string,
121
+ redactionRules?: PiiRedactionRules,
122
+ ) {
123
+ // Create overloaded function using the shared factory pattern
124
+ const logMethod = (msgOrObj: string | object, ...args: unknown[]) => {
125
+ if (typeof msgOrObj === 'object' && msgOrObj !== null) {
126
+ // Object first: (obj: object, msg?: string) => void
127
+ const obj = msgOrObj as Record<string, unknown>;
128
+ const msg = args[0] as string | undefined;
129
+ logWithContext(logger, level, msg || '', [obj], redactionRules);
130
+ } else {
131
+ // String first: (msg: string, ...args: unknown[]) => void
132
+ const msg = msgOrObj;
133
+ logWithContext(
134
+ logger,
135
+ level,
136
+ msg,
137
+ args as ConsoleArguments,
138
+ redactionRules,
139
+ );
140
+ }
141
+ };
142
+
143
+ return logMethod as ((msg: string, ...args: unknown[]) => void) &
144
+ ((obj: object, msg?: string) => void);
145
+ }
146
+
147
+ /**
148
+ * Create enhanced logger with correlation and redaction support
149
+ */
150
+ function createEnhancedLogger(
151
+ pinoLogger: PinoLogger,
152
+ _fileLogger?: PinoLogger,
153
+ redactionRules?: PiiRedactionRules,
154
+ ): Logger {
155
+ // Create a transformer for Pino logger with redaction rules
156
+ const createPinoTransformer = (_level: string) => {
157
+ return (args: unknown[], _msg?: string) => {
158
+ // Apply redaction to object arguments
159
+ if (
160
+ args.length > 0 &&
161
+ typeof args[0] === 'object' &&
162
+ args[0] !== null &&
163
+ redactionRules
164
+ ) {
165
+ args[0] = redactLogEntry(
166
+ args[0] as Record<string, unknown>,
167
+ redactionRules,
168
+ );
169
+ }
170
+ return args;
171
+ };
172
+ };
173
+
174
+ // Use the factory to create all log methods
175
+ const logMethods = createLogMethods(pinoLogger, {
176
+ transformArgs: createPinoTransformer(''),
177
+ });
178
+
179
+ return {
180
+ ...logMethods,
181
+
182
+ child: (bindings: Record<string, unknown>) => {
183
+ return createEnhancedChild(pinoLogger, bindings, redactionRules);
184
+ },
185
+
186
+ isLevelEnabled: (level: LogLevel) => {
187
+ return pinoLogger.isLevelEnabled(level);
188
+ },
189
+
190
+ flush: async (): Promise<void> => {
191
+ if ('flush' in pinoLogger) {
192
+ const flushMethod = (
193
+ pinoLogger as PinoLogger & {
194
+ flush?: (() => void) | (() => Promise<void>);
195
+ }
196
+ ).flush;
197
+ if (flushMethod && typeof flushMethod === 'function') {
198
+ const result = flushMethod();
199
+ if (isPromise(result)) {
200
+ await result;
201
+ }
202
+ }
203
+ }
204
+ },
205
+
206
+ end: async (): Promise<void> => {
207
+ if ('end' in pinoLogger) {
208
+ const endMethod = (
209
+ pinoLogger as PinoLogger & {
210
+ end?: (() => void) | (() => Promise<void>);
211
+ }
212
+ ).end;
213
+ if (endMethod && typeof endMethod === 'function') {
214
+ const result = endMethod();
215
+ if (result instanceof Promise) {
216
+ await result;
217
+ }
218
+ }
219
+ }
220
+ },
221
+ };
222
+ }
223
+
224
+ /**
225
+ * Create enhanced child logger with correlation and redaction
226
+ */
227
+ function createEnhancedChild(
228
+ parent: PinoLogger,
229
+ bindings: Record<string, unknown>,
230
+ redactionRules?: PiiRedactionRules,
231
+ ): Logger {
232
+ const child = parent.child(bindings);
233
+
234
+ // Create a transformer for Pino logger with redaction rules
235
+ const createPinoTransformer = (_level: string) => {
236
+ return (args: unknown[], _msg?: string) => {
237
+ // Apply redaction to object arguments
238
+ if (
239
+ args.length > 0 &&
240
+ typeof args[0] === 'object' &&
241
+ args[0] !== null &&
242
+ redactionRules
243
+ ) {
244
+ args[0] = redactLogEntry(
245
+ args[0] as Record<string, unknown>,
246
+ redactionRules,
247
+ );
248
+ }
249
+ return args;
250
+ };
251
+ };
252
+
253
+ // Use the factory to create all log methods
254
+ const logMethods = createLogMethods(child, {
255
+ transformArgs: createPinoTransformer(''),
256
+ });
257
+
258
+ return {
259
+ ...logMethods,
260
+
261
+ child: (moreBindings: Record<string, unknown>) => {
262
+ return createEnhancedChild(child, moreBindings, redactionRules);
263
+ },
264
+
265
+ isLevelEnabled: (level: LogLevel) => {
266
+ return child.isLevelEnabled(level);
267
+ },
268
+
269
+ flush: async (): Promise<void> => {
270
+ if ('flush' in child) {
271
+ const flushMethod = (
272
+ child as PinoLogger & {flush?: (() => void) | (() => Promise<void>)}
273
+ ).flush;
274
+ if (flushMethod && typeof flushMethod === 'function') {
275
+ const result = flushMethod();
276
+ if (isPromise(result)) {
277
+ await result;
278
+ }
279
+ }
280
+ }
281
+ },
282
+
283
+ end: async (): Promise<void> => {
284
+ if ('end' in child) {
285
+ const endMethod = (
286
+ child as PinoLogger & {end?: (() => void) | (() => Promise<void>)}
287
+ ).end;
288
+ if (endMethod && typeof endMethod === 'function') {
289
+ const result = endMethod();
290
+ if (result && typeof result === 'object' && 'then' in result) {
291
+ await result;
292
+ }
293
+ }
294
+ }
295
+ },
296
+ };
297
+ }
298
+
299
+ /**
300
+ * Create a silent logger that does nothing
301
+ */
302
+ function createSilentLogger(): Logger {
303
+ return {
304
+ fatal: () => {},
305
+ error: () => {},
306
+ warn: () => {},
307
+ info: () => {},
308
+ http: () => {},
309
+ debug: () => {},
310
+ trace: () => {},
311
+ child: () => createSilentLogger(),
312
+ isLevelEnabled: () => false,
313
+ flush: async () => {},
314
+ end: async () => {},
315
+ };
316
+ }
317
+
318
+ /**
319
+ * Log message with correlation context and redaction
320
+ */
321
+ function logWithContext(
322
+ logger: PinoLogger,
323
+ level: string,
324
+ msg: string,
325
+ args: ConsoleArguments,
326
+ redactionRules?: PiiRedactionRules,
327
+ ): void {
328
+ // Prepare log data
329
+ let logData: Record<string, unknown> = {msg};
330
+
331
+ // Add correlation context if enabled
332
+ if (isCorrelationEnabled()) {
333
+ const correlationContext = getCurrentCorrelationContext();
334
+ if (correlationContext) {
335
+ logData = {
336
+ ...logData,
337
+ ...formatCorrelationForLog(),
338
+ };
339
+
340
+ // Add correlation metadata if available
341
+ const metadata = correlationContext.metadata;
342
+ if (metadata) {
343
+ logData = {...logData, correlation: metadata};
344
+ }
345
+ }
346
+ }
347
+
348
+ // Handle additional arguments
349
+ if (args.length > 0) {
350
+ if (args.length === 1 && typeof args[0] === 'object') {
351
+ // Merge object with log data
352
+ logData = {...logData, ...args[0]};
353
+ } else {
354
+ // Add args as extra field
355
+ logData.extra = args;
356
+ }
357
+ }
358
+
359
+ // Apply redaction
360
+ if (redactionRules) {
361
+ logData = redactLogEntry(logData, redactionRules);
362
+ }
363
+
364
+ // Log to the transport
365
+ switch (level) {
366
+ case 'fatal':
367
+ logger.fatal(logData);
368
+ break;
369
+ case 'error':
370
+ logger.error(logData);
371
+ break;
372
+ case 'warn':
373
+ logger.warn(logData);
374
+ break;
375
+ case 'info':
376
+ logger.info(logData);
377
+ break;
378
+ case 'http':
379
+ if ('http' in logger) {
380
+ (logger as {http?: (data: Record<string, unknown>) => void}).http?.(
381
+ logData,
382
+ );
383
+ }
384
+ break;
385
+ case 'debug':
386
+ logger.debug(logData);
387
+ break;
388
+ case 'trace':
389
+ logger.trace(logData);
390
+ break;
391
+ default:
392
+ logger.info(logData);
393
+ break;
394
+ }
395
+ }
396
+
397
+ /**
398
+ * Create a Pino logger with environment-specific transports and CLI configuration
399
+ */
400
+ export function createPinoLogger(
401
+ config?: Partial<LoggerConfig>,
402
+ cliConfig?: LoggingCliConfig,
403
+ ): Logger {
404
+ const finalConfig = createConfig(config);
405
+ // For CLI tools, treat unset NODE_ENV as production (not development)
406
+ // Developers should explicitly set NODE_ENV=development to see debug logs
407
+ const isDevelopment = process.env.NODE_ENV === 'development';
408
+ const isTest = process.env.NODE_ENV === 'test';
409
+ const isProduction = !isDevelopment && !isTest;
410
+
411
+ // Determine transport configuration
412
+ const transportConfig = determineTransportConfig(
413
+ isProduction,
414
+ isDevelopment,
415
+ isTest,
416
+ cliConfig,
417
+ );
418
+
419
+ // Create redaction rules
420
+ const _redactionRules = createRedactionRules(
421
+ finalConfig.redact,
422
+ isProduction, // Enable email redaction in production
423
+ isProduction, // Enable user ID redaction in production
424
+ );
425
+
426
+ // Base Pino configuration with updated fields
427
+ const baseConfig: pino.LoggerOptions = {
428
+ level: finalConfig.level,
429
+ redact: finalConfig.redact,
430
+ formatters: {
431
+ level: (label: string, _number: number) => ({level: label.toUpperCase()}),
432
+ },
433
+ timestamp: pino.stdTimeFunctions.isoTime,
434
+ base: {
435
+ pid: process.pid,
436
+ // REMOVED: hostname field
437
+ platform: process.platform, // NEW: platform field
438
+ arch: process.arch, // NEW: architecture field
439
+ service: 'coder',
440
+ version: process.env.npm_package_version || 'unknown',
441
+ environment: process.env.NODE_ENV || 'production', // Default to production for CLI tools
442
+ nodeVersion: process.version, // NEW: Node.js version field
443
+ },
444
+ };
445
+
446
+ // Create environment-specific logger using transports
447
+ const logger = createEnvironmentLogger(baseConfig, transportConfig);
448
+ return logger;
449
+ }
450
+
451
+ /**
452
+ * Create a logger with custom transport configuration (for advanced usage)
453
+ */
454
+ export function createLoggerWithTransport(
455
+ config?: Partial<LoggerConfig>,
456
+ transport?: pino.DestinationStream | PinoTransportOptions,
457
+ ): Logger {
458
+ const finalConfig = createConfig(config);
459
+
460
+ // Handle transport parameter
461
+ let actualTransport: pino.DestinationStream | undefined;
462
+ if (transport) {
463
+ if (typeof transport === 'object' && 'target' in transport) {
464
+ actualTransport = pino.transport(transport) as pino.DestinationStream;
465
+ } else {
466
+ actualTransport = transport;
467
+ }
468
+ }
469
+
470
+ const pinoConfig: pino.LoggerOptions = {
471
+ level: finalConfig.level,
472
+ redact: finalConfig.redact,
473
+ formatters: {
474
+ level: (label: string, _number: number) => ({level: label.toUpperCase()}),
475
+ },
476
+ base: {
477
+ pid: process.pid,
478
+ platform: process.platform,
479
+ arch: process.arch,
480
+ service: 'coder',
481
+ version: process.env.npm_package_version || 'unknown',
482
+ environment: process.env.NODE_ENV || 'production',
483
+ nodeVersion: process.version, // NEW: Node.js version field
484
+ },
485
+ };
486
+
487
+ const pinoLogger = actualTransport
488
+ ? pino(pinoConfig, actualTransport)
489
+ : pino(pinoConfig);
490
+ const redactionRules = createRedactionRules(
491
+ finalConfig.redact,
492
+ true, // Enable email redaction
493
+ true, // Enable user ID redaction
494
+ );
495
+
496
+ return createEnhancedLogger(pinoLogger, undefined, redactionRules);
497
+ }
498
+
499
+ /**
500
+ * Get logger statistics
501
+ */
502
+ export function getLoggerStats(): {
503
+ level: string;
504
+ silent: boolean;
505
+ environment: string;
506
+ } {
507
+ const config = createConfig();
508
+ const environment = process.env.NODE_ENV || 'production';
509
+ return {
510
+ level: config.level,
511
+ silent: config.level === 'silent',
512
+ environment,
513
+ };
514
+ }