@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,362 @@
1
+ /**
2
+ * Logger Provider - Implements dependency injection pattern for logging
3
+ * This file provides centralized logger management without circular dependencies
4
+ */
5
+
6
+ import {createLogMethods} from './log-method-factory.js';
7
+ import type {LogLevel, Logger, LoggerConfig} from './types.js';
8
+
9
+ export class LoggerProvider {
10
+ private static instance: LoggerProvider | null = null;
11
+ private _logger: Logger | null = null;
12
+ private _config: LoggerConfig | null = null;
13
+ private _dependenciesLoaded = false;
14
+
15
+ // Lazy-loaded dependencies
16
+ private _createPinoLogger:
17
+ | ((config?: Partial<LoggerConfig>) => Logger)
18
+ | null = null;
19
+ private _createConfig:
20
+ | ((config?: Partial<LoggerConfig>) => LoggerConfig)
21
+ | null = null;
22
+
23
+ private constructor() {
24
+ // Private constructor for singleton pattern
25
+ }
26
+
27
+ /**
28
+ * Get the singleton logger provider instance
29
+ */
30
+ public static getInstance(): LoggerProvider {
31
+ if (!LoggerProvider.instance) {
32
+ LoggerProvider.instance = new LoggerProvider();
33
+ }
34
+ return LoggerProvider.instance;
35
+ }
36
+
37
+ /**
38
+ * Initialize lazy-loaded dependencies to avoid circular imports
39
+ */
40
+ private ensureDependenciesLoaded() {
41
+ if (this._dependenciesLoaded) {
42
+ return;
43
+ }
44
+
45
+ // For now, use fallback logger synchronously to avoid circular dependencies
46
+ // The real Pino logger will be loaded asynchronously when needed
47
+ this._createPinoLogger = () => this.createFallbackLogger();
48
+ this._createConfig = (config?: Partial<LoggerConfig>) => ({
49
+ level: 'silent', // Default to silent for production CLI usage
50
+ pretty: false,
51
+ redact: [],
52
+ correlation: false,
53
+ serialize: false,
54
+ ...config,
55
+ });
56
+ this._dependenciesLoaded = true;
57
+
58
+ // Asynchronously load the real dependencies and replace the fallback
59
+ this.loadRealDependencies().catch(error => {
60
+ try {
61
+ const fallbackLogger = this.createFallbackLogger();
62
+ fallbackLogger.error(
63
+ '[LOGGER_PROVIDER] Failed to load real dependencies',
64
+ {
65
+ error: this.formatErrorForLogging(error),
66
+ fallback: true,
67
+ source: 'logger-provider',
68
+ timestamp: new Date().toISOString(),
69
+ },
70
+ );
71
+ } catch (fallbackError) {
72
+ // Absolute fallback to console if everything else fails
73
+ console.error(
74
+ '[LOGGER_PROVIDER] Critical failure - fallback logger failed:',
75
+ fallbackError,
76
+ 'Original error:',
77
+ error,
78
+ );
79
+ }
80
+ });
81
+ }
82
+
83
+ /**
84
+ * Asynchronously load real Pino dependencies
85
+ * Uses dynamic imports to avoid circular dependency issues
86
+ */
87
+ private async loadRealDependencies() {
88
+ // Skip if already loaded to prevent duplicate loading
89
+ if (this._dependenciesLoaded) {
90
+ // Only log in development mode to avoid noise for end users
91
+ if (process.env.NODE_ENV === 'development') {
92
+ this.createFallbackLogger().debug('Real dependencies already loaded', {
93
+ source: 'logger-provider',
94
+ status: 'already-loaded',
95
+ });
96
+ }
97
+ return;
98
+ }
99
+
100
+ const startTime = Date.now();
101
+ // Only log in development mode to avoid noise for end users
102
+ if (process.env.NODE_ENV === 'development') {
103
+ this.createFallbackLogger().info('Loading real Pino dependencies', {
104
+ source: 'logger-provider',
105
+ method: 'dynamic-import',
106
+ status: 'starting',
107
+ });
108
+ }
109
+
110
+ try {
111
+ // Load dependencies dynamically to avoid circular imports
112
+ // Using Promise.all for parallel loading to improve performance
113
+ const [pinoLogger, configModule] = await Promise.all([
114
+ import('./pino-logger.js'),
115
+ import('./config.js'),
116
+ ]);
117
+
118
+ // Verify imports were successful
119
+ if (!pinoLogger?.createPinoLogger || !configModule?.createConfig) {
120
+ throw new Error('Dynamic imports returned invalid modules');
121
+ }
122
+
123
+ this._createPinoLogger = pinoLogger.createPinoLogger;
124
+ this._createConfig = configModule.createConfig;
125
+ this._dependenciesLoaded = true;
126
+
127
+ // If we already have a logger with fallback config, reinitialize it with real config
128
+ if (this._logger && this._config) {
129
+ try {
130
+ this._logger = this._createPinoLogger(this._config);
131
+ // Only log in development mode
132
+ if (process.env.NODE_ENV === 'development') {
133
+ this.createFallbackLogger().info(
134
+ 'Logger reinitialized with real Pino instance',
135
+ {
136
+ source: 'logger-provider',
137
+ status: 'reinitialized',
138
+ duration: Date.now() - startTime,
139
+ },
140
+ );
141
+ }
142
+ } catch (reinitError) {
143
+ this.createFallbackLogger().warn(
144
+ 'Failed to reinitialize logger, keeping fallback',
145
+ {
146
+ error: this.formatErrorForLogging(reinitError),
147
+ source: 'logger-provider',
148
+ status: 'reinit-failed',
149
+ },
150
+ );
151
+ }
152
+ }
153
+
154
+ // Only log in development mode
155
+ if (process.env.NODE_ENV === 'development') {
156
+ this.createFallbackLogger().info(
157
+ 'Real dependencies loaded successfully',
158
+ {
159
+ source: 'logger-provider',
160
+ status: 'success',
161
+ duration: Date.now() - startTime,
162
+ modules: ['pino-logger', 'config'],
163
+ },
164
+ );
165
+ }
166
+ } catch (error) {
167
+ try {
168
+ const fallbackLogger = this.createFallbackLogger();
169
+ fallbackLogger.error(
170
+ '[LOGGER_PROVIDER] Failed to load real dependencies',
171
+ {
172
+ error: this.formatErrorForLogging(error),
173
+ fallback: true,
174
+ source: 'logger-provider',
175
+ status: 'load-failed',
176
+ duration: Date.now() - startTime,
177
+ },
178
+ );
179
+ } catch (fallbackError) {
180
+ // Absolute fallback to console if everything else fails
181
+ console.error(
182
+ '[LOGGER_PROVIDER] Critical failure - fallback logger failed:',
183
+ fallbackError,
184
+ 'Original error:',
185
+ error,
186
+ );
187
+ }
188
+ // Keep the fallback logger
189
+ }
190
+ }
191
+
192
+ /**
193
+ * Create fallback logger when dependencies fail to load
194
+ */
195
+ private createFallbackLogger(): Logger {
196
+ // Check current config level - default to silent for production
197
+ const configLevel = this._config?.level || 'silent';
198
+ const isSilent = configLevel === 'silent';
199
+
200
+ // If silent, return a no-op logger
201
+ if (isSilent) {
202
+ const noOp = () => {};
203
+ return {
204
+ fatal: noOp,
205
+ error: noOp,
206
+ warn: noOp,
207
+ info: noOp,
208
+ http: noOp,
209
+ debug: noOp,
210
+ trace: noOp,
211
+ child: (_bindings: Record<string, unknown>) =>
212
+ this.createFallbackLogger(),
213
+ isLevelEnabled: (_level: string) => false,
214
+ flush: async () => Promise.resolve(),
215
+ end: async () => Promise.resolve(),
216
+ };
217
+ }
218
+
219
+ const fallbackConsole = console; // Use console as the logger
220
+
221
+ // Create all log methods using the factory
222
+ const logMethods = createLogMethods(fallbackConsole, {
223
+ consolePrefix: '',
224
+ transformArgs: (args, _level, _msg) => {
225
+ // Note: Level prefix is handled by consolePrefix option in createLogMethod
226
+ return args;
227
+ },
228
+ });
229
+
230
+ return {
231
+ ...logMethods,
232
+ child: (_bindings: Record<string, unknown>) =>
233
+ this.createFallbackLogger(),
234
+ isLevelEnabled: (_level: string) => true,
235
+ flush: async () => Promise.resolve(),
236
+ end: async () => Promise.resolve(),
237
+ };
238
+ }
239
+
240
+ /**
241
+ * Create default configuration based on environment
242
+ */
243
+ private createDefaultConfig(
244
+ override: Partial<LoggerConfig> = {},
245
+ ): LoggerConfig {
246
+ const isDev = process.env.NODE_ENV === 'development';
247
+ const isTest = process.env.NODE_ENV === 'test';
248
+
249
+ const defaultConfig: LoggerConfig = {
250
+ level: isTest
251
+ ? 'silent'
252
+ : isDev
253
+ ? 'debug'
254
+ : (process.env.CODER_LOG_LEVEL as LogLevel) || 'silent', // Default to silent for production/CLI usage
255
+ pretty: isDev,
256
+ redact: ['apiKey', 'token', 'password', 'secret'],
257
+ correlation: true,
258
+ serialize: !isDev,
259
+ };
260
+
261
+ return {...defaultConfig, ...override};
262
+ }
263
+
264
+ /**
265
+ * Initialize the logger with configuration
266
+ */
267
+ public initializeLogger(config?: Partial<LoggerConfig>): Logger {
268
+ if (this._logger) {
269
+ return this._logger;
270
+ }
271
+
272
+ this.ensureDependenciesLoaded();
273
+ this._config = this.createDefaultConfig(config);
274
+ this._logger =
275
+ this._createPinoLogger?.(this._config) ?? this.createFallbackLogger();
276
+
277
+ return this._logger;
278
+ }
279
+
280
+ /**
281
+ * Get the current logger instance
282
+ */
283
+ public getLogger(): Logger {
284
+ if (!this._logger) {
285
+ // Auto-initialize with defaults if not already done
286
+ return this.initializeLogger();
287
+ }
288
+ return this._logger;
289
+ }
290
+
291
+ /**
292
+ * Get the current configuration
293
+ */
294
+ public getLoggerConfig(): LoggerConfig | null {
295
+ return this._config;
296
+ }
297
+
298
+ /**
299
+ * Create a child logger with additional context
300
+ */
301
+ public createChildLogger(bindings: Record<string, unknown>): Logger {
302
+ const parent = this.getLogger();
303
+ return parent.child(bindings);
304
+ }
305
+
306
+ /**
307
+ * Format error for structured logging
308
+ */
309
+ private formatErrorForLogging(error: unknown): object {
310
+ if (error instanceof Error) {
311
+ return {
312
+ message: error.message,
313
+ stack: error.stack,
314
+ name: error.name,
315
+ cause: error.cause,
316
+ };
317
+ }
318
+ return {value: error};
319
+ }
320
+
321
+ /**
322
+ * Check if a log level is enabled
323
+ */
324
+ public isLevelEnabled(level: LogLevel): boolean {
325
+ const logger = this.getLogger();
326
+ return logger.isLevelEnabled(level);
327
+ }
328
+
329
+ /**
330
+ * Reset the logger instance (useful for testing)
331
+ */
332
+ public reset(): void {
333
+ this._logger = null;
334
+ this._config = null;
335
+ this._dependenciesLoaded = false;
336
+ this._createPinoLogger = null;
337
+ this._createConfig = null;
338
+ }
339
+
340
+ /**
341
+ * Flush any pending logs
342
+ */
343
+ public async flush(): Promise<void> {
344
+ if (this._logger) {
345
+ await this._logger.flush();
346
+ }
347
+ }
348
+
349
+ /**
350
+ * End the logger and close all streams
351
+ */
352
+ public async end(): Promise<void> {
353
+ if (this._logger) {
354
+ await this._logger.end();
355
+ this._logger = null;
356
+ this._config = null;
357
+ }
358
+ }
359
+ }
360
+
361
+ // Export the singleton instance for easy access
362
+ export const loggerProvider = LoggerProvider.getInstance();
@@ -0,0 +1,209 @@
1
+ import test from 'ava';
2
+ import {
3
+ correlationStorage,
4
+ getCurrentCorrelationContext,
5
+ } from './correlation.js';
6
+ import {
7
+ checkMemoryThresholds,
8
+ measureTime,
9
+ takePerformanceSnapshot,
10
+ trackPerformance,
11
+ } from './performance.js';
12
+
13
+ // Test the trackPerformance decorator with async context handling
14
+ test('trackPerformance decorator maintains correlation context throughout async operation', async t => {
15
+ const testFn = async (value: unknown) => {
16
+ // Simulate async operation
17
+ await new Promise(resolve => setTimeout(resolve, 10));
18
+ return `processed-${String(value)}`;
19
+ };
20
+
21
+ const decoratedFn = trackPerformance(testFn, 'test-async-operation', {
22
+ logLevel: 'debug',
23
+ trackMemory: false,
24
+ trackCpu: false,
25
+ });
26
+
27
+ const result = await decoratedFn('test-input');
28
+
29
+ t.is(result, 'processed-test-input', 'Function should return correct result');
30
+ });
31
+
32
+ test('trackPerformance decorator handles errors correctly', async t => {
33
+ const testFn = async () => {
34
+ throw new Error('Test error');
35
+ };
36
+
37
+ const decoratedFn = trackPerformance(testFn, 'test-error-handling', {
38
+ logLevel: 'debug',
39
+ trackMemory: false,
40
+ trackCpu: false,
41
+ });
42
+
43
+ const error = await t.throwsAsync(async () => {
44
+ await decoratedFn();
45
+ });
46
+
47
+ t.is(error.message, 'Test error', 'Error should be propagated correctly');
48
+ });
49
+
50
+ test('measureTime function maintains correlation context', async t => {
51
+ const result = await measureTime(
52
+ async () => {
53
+ await new Promise(resolve => setTimeout(resolve, 5));
54
+ return 'test-result';
55
+ },
56
+ 'test-measurement',
57
+ {
58
+ logPerformance: false,
59
+ trackMemory: false,
60
+ trackCpu: false,
61
+ },
62
+ );
63
+
64
+ t.is(result.result, 'test-result', 'Should return correct result');
65
+ t.truthy(result.duration >= 0, 'Should have valid duration');
66
+ });
67
+
68
+ test('checkMemoryThresholds function works correctly', t => {
69
+ const memory = {
70
+ heapUsed: 100 * 1024 * 1024, // 100MB
71
+ heapTotal: 200 * 1024 * 1024, // 200MB
72
+ external: 50 * 1024 * 1024, // 50MB
73
+ rss: 150 * 1024 * 1024, // 150MB
74
+ arrayBuffers: 10 * 1024 * 1024, // 10MB
75
+ };
76
+
77
+ const result = checkMemoryThresholds(memory, {
78
+ heapUsagePercentThreshold: 0.9,
79
+ heapUsageAbsoluteThreshold: 512,
80
+ });
81
+
82
+ t.true(result.isHealthy, 'Should be healthy with these thresholds');
83
+ t.is(result.warnings.length, 0, 'Should have no warnings');
84
+ });
85
+
86
+ test('takePerformanceSnapshot function works correctly', t => {
87
+ const snapshot = takePerformanceSnapshot();
88
+
89
+ t.truthy(snapshot.timestamp, 'Should have timestamp');
90
+ t.truthy(snapshot.memory, 'Should have memory data');
91
+ t.truthy(snapshot.uptime >= 0, 'Should have uptime');
92
+ t.truthy(snapshot.correlationId, 'Should have correlation ID');
93
+ });
94
+
95
+ test('trackPerformance with complex async chains maintains context', async t => {
96
+ const testFn = async () => {
97
+ // Complex async chain
98
+ const step1 = await new Promise(resolve =>
99
+ setTimeout(() => resolve('step1'), 10),
100
+ );
101
+ const step2 = await new Promise(resolve =>
102
+ setTimeout(() => resolve('step2'), 10),
103
+ );
104
+ const step3 = await new Promise(resolve =>
105
+ setTimeout(() => resolve('step3'), 10),
106
+ );
107
+
108
+ return {step1, step2, step3};
109
+ };
110
+
111
+ const decoratedFn = trackPerformance(testFn, 'complex-async-chain', {
112
+ logLevel: 'debug',
113
+ trackMemory: false,
114
+ trackCpu: false,
115
+ });
116
+
117
+ const result = await decoratedFn();
118
+
119
+ t.deepEqual(
120
+ result,
121
+ {step1: 'step1', step2: 'step2', step3: 'step3'},
122
+ 'Should handle complex async chains',
123
+ );
124
+ });
125
+
126
+ test('trackPerformance with nested async operations', async t => {
127
+ const outerFn = async () => {
128
+ const innerResult = await trackPerformance(
129
+ async () => {
130
+ await new Promise(resolve => setTimeout(resolve, 5));
131
+ return 'inner-result';
132
+ },
133
+ 'nested-operation',
134
+ {logLevel: 'debug', trackMemory: false, trackCpu: false},
135
+ )();
136
+
137
+ return `outer-${innerResult}`;
138
+ };
139
+
140
+ const decoratedFn = trackPerformance(outerFn, 'outer-operation', {
141
+ logLevel: 'debug',
142
+ trackMemory: false,
143
+ trackCpu: false,
144
+ });
145
+
146
+ const result = await decoratedFn();
147
+
148
+ t.is(result, 'outer-inner-result', 'Should handle nested async operations');
149
+ });
150
+
151
+ test('measureTime with thresholds', async t => {
152
+ const result = await measureTime(
153
+ async () => {
154
+ // Use a longer delay to ensure we exceed the threshold
155
+ await new Promise(resolve => setTimeout(resolve, 50));
156
+ return 'slow-result';
157
+ },
158
+ 'slow-operation',
159
+ {
160
+ logPerformance: false,
161
+ trackMemory: false,
162
+ trackCpu: false,
163
+ thresholds: {
164
+ duration: 10, // Set threshold below actual duration
165
+ },
166
+ },
167
+ );
168
+
169
+ t.is(
170
+ result.result,
171
+ 'slow-result',
172
+ 'Should return correct result even with threshold exceeded',
173
+ );
174
+ t.true(result.duration >= 10, 'Should have duration >= 10ms');
175
+ });
176
+
177
+ test('trackPerformance maintains context across Promise boundaries', async t => {
178
+ let contextId: string | null = null;
179
+
180
+ const testFn = async () => {
181
+ // Get context at start
182
+ const startContext = correlationStorage.getStore();
183
+
184
+ // Simulate async boundary
185
+ await new Promise(resolve => setTimeout(resolve, 10));
186
+
187
+ // Get context after async boundary
188
+ const endContext = correlationStorage.getStore();
189
+
190
+ // Both should be the same context
191
+ if (startContext && endContext) {
192
+ contextId = startContext.id;
193
+ return startContext.id === endContext.id;
194
+ }
195
+
196
+ return false;
197
+ };
198
+
199
+ const decoratedFn = trackPerformance(testFn, 'context-persistence-test', {
200
+ logLevel: 'debug',
201
+ trackMemory: false,
202
+ trackCpu: false,
203
+ });
204
+
205
+ const result = await decoratedFn();
206
+
207
+ t.true(result, 'Context should persist across async boundaries');
208
+ t.truthy(contextId, 'Should have a valid context ID');
209
+ });