@gguf/coder 0.2.9 → 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 (439) 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/dist/tools/execute-bash.js +3 -3
  10. package/dist/tools/execute-bash.js.map +1 -1
  11. package/dist/tools/fetch-url.js +3 -3
  12. package/dist/tools/fetch-url.js.map +1 -1
  13. package/dist/tools/find-files.d.ts.map +1 -1
  14. package/dist/tools/find-files.js +1 -1
  15. package/dist/tools/find-files.js.map +1 -1
  16. package/dist/tools/lsp-get-diagnostics.js +1 -1
  17. package/dist/tools/lsp-get-diagnostics.js.map +1 -1
  18. package/dist/tools/read-file.d.ts.map +1 -1
  19. package/dist/tools/read-file.js +6 -6
  20. package/dist/tools/read-file.js.map +1 -1
  21. package/dist/tools/search-file-contents.d.ts.map +1 -1
  22. package/dist/tools/search-file-contents.js +1 -1
  23. package/dist/tools/search-file-contents.js.map +1 -1
  24. package/dist/tools/string-replace.js +11 -11
  25. package/dist/tools/string-replace.js.map +1 -1
  26. package/dist/tools/web-search.d.ts.map +1 -1
  27. package/dist/tools/web-search.js +3 -3
  28. package/dist/tools/web-search.js.map +1 -1
  29. package/dist/tools/write-file.js +4 -4
  30. package/dist/tools/write-file.js.map +1 -1
  31. package/dist/utils/tool-result-display.d.ts.map +1 -1
  32. package/dist/utils/tool-result-display.js +3 -3
  33. package/dist/utils/tool-result-display.js.map +1 -1
  34. package/package.json +2 -14
  35. package/scripts/extract-changelog.js +73 -0
  36. package/scripts/fetch-models.js +143 -0
  37. package/scripts/test.sh +40 -0
  38. package/scripts/update-homebrew-formula.sh +125 -0
  39. package/scripts/update-nix-version.sh +157 -0
  40. package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
  41. package/source/ai-sdk-client/AISDKClient.ts +155 -0
  42. package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
  43. package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
  44. package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
  45. package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
  46. package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
  47. package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
  48. package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
  49. package/source/ai-sdk-client/converters/message-converter.ts +113 -0
  50. package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
  51. package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
  52. package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
  53. package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
  54. package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
  55. package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
  56. package/source/ai-sdk-client/index.ts +7 -0
  57. package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
  58. package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
  59. package/source/ai-sdk-client/types.ts +9 -0
  60. package/source/ai-sdk-client-empty-message.spec.ts +141 -0
  61. package/source/ai-sdk-client-error-handling.spec.ts +186 -0
  62. package/source/ai-sdk-client-maxretries.spec.ts +114 -0
  63. package/source/ai-sdk-client-preparestep.spec.ts +279 -0
  64. package/source/app/App.spec.tsx +32 -0
  65. package/source/app/App.tsx +480 -0
  66. package/source/app/components/AppContainer.spec.tsx +96 -0
  67. package/source/app/components/AppContainer.tsx +56 -0
  68. package/source/app/components/ChatInterface.spec.tsx +163 -0
  69. package/source/app/components/ChatInterface.tsx +144 -0
  70. package/source/app/components/ModalSelectors.spec.tsx +141 -0
  71. package/source/app/components/ModalSelectors.tsx +135 -0
  72. package/source/app/helpers.spec.ts +97 -0
  73. package/source/app/helpers.ts +63 -0
  74. package/source/app/index.ts +4 -0
  75. package/source/app/types.ts +39 -0
  76. package/source/app/utils/appUtils.ts +294 -0
  77. package/source/app/utils/conversationState.ts +310 -0
  78. package/source/app.spec.tsx +244 -0
  79. package/source/cli.spec.ts +73 -0
  80. package/source/cli.tsx +51 -0
  81. package/source/client-factory.spec.ts +48 -0
  82. package/source/client-factory.ts +178 -0
  83. package/source/command-parser.spec.ts +127 -0
  84. package/source/command-parser.ts +36 -0
  85. package/source/commands/checkpoint.spec.tsx +277 -0
  86. package/source/commands/checkpoint.tsx +366 -0
  87. package/source/commands/clear.tsx +22 -0
  88. package/source/commands/custom-commands.tsx +121 -0
  89. package/source/commands/exit.ts +21 -0
  90. package/source/commands/export.spec.tsx +131 -0
  91. package/source/commands/export.tsx +79 -0
  92. package/source/commands/help.tsx +120 -0
  93. package/source/commands/index.ts +17 -0
  94. package/source/commands/init.tsx +339 -0
  95. package/source/commands/lsp-command.spec.tsx +281 -0
  96. package/source/commands/lsp.tsx +120 -0
  97. package/source/commands/mcp-command.spec.tsx +313 -0
  98. package/source/commands/mcp.tsx +162 -0
  99. package/source/commands/model-database.spec.tsx +758 -0
  100. package/source/commands/model-database.tsx +418 -0
  101. package/source/commands/model.ts +12 -0
  102. package/source/commands/provider.ts +12 -0
  103. package/source/commands/setup-config.tsx +16 -0
  104. package/source/commands/simple-commands.spec.tsx +175 -0
  105. package/source/commands/status.ts +12 -0
  106. package/source/commands/theme.ts +12 -0
  107. package/source/commands/update.spec.tsx +261 -0
  108. package/source/commands/update.tsx +201 -0
  109. package/source/commands/usage.spec.tsx +495 -0
  110. package/source/commands/usage.tsx +100 -0
  111. package/source/commands.spec.ts +436 -0
  112. package/source/commands.ts +83 -0
  113. package/source/components/assistant-message.spec.tsx +796 -0
  114. package/source/components/assistant-message.tsx +34 -0
  115. package/source/components/bash-execution-indicator.tsx +21 -0
  116. package/source/components/cancelling-indicator.tsx +16 -0
  117. package/source/components/chat-queue.spec.tsx +83 -0
  118. package/source/components/chat-queue.tsx +36 -0
  119. package/source/components/checkpoint-display.spec.tsx +219 -0
  120. package/source/components/checkpoint-display.tsx +126 -0
  121. package/source/components/checkpoint-selector.spec.tsx +173 -0
  122. package/source/components/checkpoint-selector.tsx +173 -0
  123. package/source/components/development-mode-indicator.spec.tsx +268 -0
  124. package/source/components/development-mode-indicator.tsx +38 -0
  125. package/source/components/message-box.spec.tsx +427 -0
  126. package/source/components/message-box.tsx +87 -0
  127. package/source/components/model-selector.tsx +132 -0
  128. package/source/components/provider-selector.tsx +75 -0
  129. package/source/components/random-spinner.tsx +19 -0
  130. package/source/components/security-disclaimer.tsx +73 -0
  131. package/source/components/status-connection-display.spec.tsx +133 -0
  132. package/source/components/status.tsx +267 -0
  133. package/source/components/theme-selector.tsx +126 -0
  134. package/source/components/tool-confirmation.tsx +190 -0
  135. package/source/components/tool-execution-indicator.tsx +33 -0
  136. package/source/components/tool-message.tsx +85 -0
  137. package/source/components/ui/titled-box.spec.tsx +207 -0
  138. package/source/components/ui/titled-box.tsx +57 -0
  139. package/source/components/usage/progress-bar.spec.tsx +398 -0
  140. package/source/components/usage/progress-bar.tsx +30 -0
  141. package/source/components/usage/usage-display.spec.tsx +780 -0
  142. package/source/components/usage/usage-display.tsx +291 -0
  143. package/source/components/user-input.spec.tsx +327 -0
  144. package/source/components/user-input.tsx +533 -0
  145. package/source/components/user-message.spec.tsx +230 -0
  146. package/source/components/user-message.tsx +84 -0
  147. package/source/components/welcome-message.tsx +76 -0
  148. package/source/config/env-substitution.ts +65 -0
  149. package/source/config/index.spec.ts +171 -0
  150. package/source/config/index.ts +154 -0
  151. package/source/config/paths.spec.ts +241 -0
  152. package/source/config/paths.ts +55 -0
  153. package/source/config/preferences.ts +51 -0
  154. package/source/config/themes.ts +315 -0
  155. package/source/constants.ts +130 -0
  156. package/source/context/mode-context.spec.ts +79 -0
  157. package/source/context/mode-context.ts +24 -0
  158. package/source/custom-commands/executor.spec.ts +142 -0
  159. package/source/custom-commands/executor.ts +64 -0
  160. package/source/custom-commands/loader.spec.ts +314 -0
  161. package/source/custom-commands/loader.ts +153 -0
  162. package/source/custom-commands/parser.ts +196 -0
  163. package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
  164. package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
  165. package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
  166. package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
  167. package/source/hooks/chat-handler/index.ts +12 -0
  168. package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
  169. package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
  170. package/source/hooks/chat-handler/types.ts +38 -0
  171. package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
  172. package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
  173. package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
  174. package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
  175. package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
  176. package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
  177. package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
  178. package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
  179. package/source/hooks/useAppHandlers.tsx +291 -0
  180. package/source/hooks/useAppInitialization.tsx +422 -0
  181. package/source/hooks/useAppState.tsx +311 -0
  182. package/source/hooks/useDirectoryTrust.tsx +98 -0
  183. package/source/hooks/useInputState.ts +414 -0
  184. package/source/hooks/useModeHandlers.tsx +302 -0
  185. package/source/hooks/useNonInteractiveMode.ts +140 -0
  186. package/source/hooks/useTerminalWidth.tsx +81 -0
  187. package/source/hooks/useTheme.ts +18 -0
  188. package/source/hooks/useToolHandler.tsx +349 -0
  189. package/source/hooks/useUIState.ts +61 -0
  190. package/source/init/agents-template-generator.ts +421 -0
  191. package/source/init/existing-rules-extractor.ts +319 -0
  192. package/source/init/file-scanner.spec.ts +227 -0
  193. package/source/init/file-scanner.ts +238 -0
  194. package/source/init/framework-detector.ts +382 -0
  195. package/source/init/language-detector.ts +269 -0
  196. package/source/init/project-analyzer.spec.ts +231 -0
  197. package/source/init/project-analyzer.ts +458 -0
  198. package/source/lsp/index.ts +31 -0
  199. package/source/lsp/lsp-client.spec.ts +508 -0
  200. package/source/lsp/lsp-client.ts +487 -0
  201. package/source/lsp/lsp-manager.spec.ts +477 -0
  202. package/source/lsp/lsp-manager.ts +419 -0
  203. package/source/lsp/protocol.spec.ts +502 -0
  204. package/source/lsp/protocol.ts +360 -0
  205. package/source/lsp/server-discovery.spec.ts +654 -0
  206. package/source/lsp/server-discovery.ts +515 -0
  207. package/source/markdown-parser/html-entities.spec.ts +88 -0
  208. package/source/markdown-parser/html-entities.ts +45 -0
  209. package/source/markdown-parser/index.spec.ts +281 -0
  210. package/source/markdown-parser/index.ts +126 -0
  211. package/source/markdown-parser/table-parser.spec.ts +133 -0
  212. package/source/markdown-parser/table-parser.ts +114 -0
  213. package/source/markdown-parser/utils.spec.ts +70 -0
  214. package/source/markdown-parser/utils.ts +13 -0
  215. package/source/mcp/mcp-client.spec.ts +81 -0
  216. package/source/mcp/mcp-client.ts +625 -0
  217. package/source/mcp/transport-factory.spec.ts +406 -0
  218. package/source/mcp/transport-factory.ts +312 -0
  219. package/source/message-handler.ts +67 -0
  220. package/source/model-database/database-engine.spec.ts +494 -0
  221. package/source/model-database/database-engine.ts +50 -0
  222. package/source/model-database/model-database.spec.ts +363 -0
  223. package/source/model-database/model-database.ts +91 -0
  224. package/source/model-database/model-engine.spec.ts +447 -0
  225. package/source/model-database/model-engine.ts +65 -0
  226. package/source/model-database/model-fetcher.spec.ts +583 -0
  227. package/source/model-database/model-fetcher.ts +330 -0
  228. package/source/models/index.ts +1 -0
  229. package/source/models/models-cache.spec.ts +214 -0
  230. package/source/models/models-cache.ts +78 -0
  231. package/source/models/models-dev-client.spec.ts +379 -0
  232. package/source/models/models-dev-client.ts +329 -0
  233. package/source/models/models-types.ts +68 -0
  234. package/source/prompt-history.ts +155 -0
  235. package/source/security/command-injection.spec.ts +240 -0
  236. package/source/services/checkpoint-manager.spec.ts +523 -0
  237. package/source/services/checkpoint-manager.ts +466 -0
  238. package/source/services/file-snapshot.spec.ts +569 -0
  239. package/source/services/file-snapshot.ts +220 -0
  240. package/source/test-utils/render-with-theme.tsx +48 -0
  241. package/source/tokenization/index.ts +1 -0
  242. package/source/tokenization/tokenizer-factory.spec.ts +170 -0
  243. package/source/tokenization/tokenizer-factory.ts +125 -0
  244. package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
  245. package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
  246. package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
  247. package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
  248. package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
  249. package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
  250. package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
  251. package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
  252. package/source/tool-calling/index.ts +5 -0
  253. package/source/tool-calling/json-parser.spec.ts +639 -0
  254. package/source/tool-calling/json-parser.ts +247 -0
  255. package/source/tool-calling/tool-parser.spec.ts +395 -0
  256. package/source/tool-calling/tool-parser.ts +120 -0
  257. package/source/tool-calling/xml-parser.spec.ts +662 -0
  258. package/source/tool-calling/xml-parser.ts +289 -0
  259. package/source/tools/execute-bash.spec.tsx +353 -0
  260. package/source/tools/execute-bash.tsx +219 -0
  261. package/source/tools/execute-function.spec.ts +130 -0
  262. package/source/tools/fetch-url.spec.tsx +342 -0
  263. package/source/tools/fetch-url.tsx +172 -0
  264. package/source/tools/find-files.spec.tsx +924 -0
  265. package/source/tools/find-files.tsx +293 -0
  266. package/source/tools/index.ts +102 -0
  267. package/source/tools/lsp-get-diagnostics.tsx +192 -0
  268. package/source/tools/needs-approval.spec.ts +282 -0
  269. package/source/tools/read-file.spec.tsx +801 -0
  270. package/source/tools/read-file.tsx +387 -0
  271. package/source/tools/search-file-contents.spec.tsx +1273 -0
  272. package/source/tools/search-file-contents.tsx +293 -0
  273. package/source/tools/string-replace.spec.tsx +730 -0
  274. package/source/tools/string-replace.tsx +548 -0
  275. package/source/tools/tool-manager.ts +210 -0
  276. package/source/tools/tool-registry.spec.ts +415 -0
  277. package/source/tools/tool-registry.ts +228 -0
  278. package/source/tools/web-search.tsx +223 -0
  279. package/source/tools/write-file.spec.tsx +559 -0
  280. package/source/tools/write-file.tsx +228 -0
  281. package/source/types/app.ts +37 -0
  282. package/source/types/checkpoint.ts +48 -0
  283. package/source/types/commands.ts +46 -0
  284. package/source/types/components.ts +27 -0
  285. package/source/types/config.ts +103 -0
  286. package/source/types/core-connection-status.spec.ts +67 -0
  287. package/source/types/core.ts +181 -0
  288. package/source/types/hooks.ts +50 -0
  289. package/source/types/index.ts +12 -0
  290. package/source/types/markdown-parser.ts +11 -0
  291. package/source/types/mcp.ts +52 -0
  292. package/source/types/system.ts +16 -0
  293. package/source/types/tokenization.ts +41 -0
  294. package/source/types/ui.ts +40 -0
  295. package/source/types/usage.ts +58 -0
  296. package/source/types/utils.ts +16 -0
  297. package/source/usage/calculator.spec.ts +385 -0
  298. package/source/usage/calculator.ts +104 -0
  299. package/source/usage/storage.spec.ts +703 -0
  300. package/source/usage/storage.ts +238 -0
  301. package/source/usage/tracker.spec.ts +456 -0
  302. package/source/usage/tracker.ts +102 -0
  303. package/source/utils/atomic-deletion.spec.ts +194 -0
  304. package/source/utils/atomic-deletion.ts +127 -0
  305. package/source/utils/bounded-map.spec.ts +300 -0
  306. package/source/utils/bounded-map.ts +193 -0
  307. package/source/utils/checkpoint-utils.spec.ts +222 -0
  308. package/source/utils/checkpoint-utils.ts +92 -0
  309. package/source/utils/error-formatter.spec.ts +169 -0
  310. package/source/utils/error-formatter.ts +194 -0
  311. package/source/utils/file-autocomplete.spec.ts +173 -0
  312. package/source/utils/file-autocomplete.ts +196 -0
  313. package/source/utils/file-cache.spec.ts +309 -0
  314. package/source/utils/file-cache.ts +195 -0
  315. package/source/utils/file-content-loader.spec.ts +180 -0
  316. package/source/utils/file-content-loader.ts +179 -0
  317. package/source/utils/file-mention-handler.spec.ts +261 -0
  318. package/source/utils/file-mention-handler.ts +84 -0
  319. package/source/utils/file-mention-parser.spec.ts +182 -0
  320. package/source/utils/file-mention-parser.ts +170 -0
  321. package/source/utils/fuzzy-matching.spec.ts +149 -0
  322. package/source/utils/fuzzy-matching.ts +146 -0
  323. package/source/utils/indentation-normalizer.spec.ts +216 -0
  324. package/source/utils/indentation-normalizer.ts +76 -0
  325. package/source/utils/installation-detector.spec.ts +178 -0
  326. package/source/utils/installation-detector.ts +153 -0
  327. package/source/utils/logging/config.spec.ts +311 -0
  328. package/source/utils/logging/config.ts +210 -0
  329. package/source/utils/logging/console-facade.spec.ts +184 -0
  330. package/source/utils/logging/console-facade.ts +384 -0
  331. package/source/utils/logging/correlation.spec.ts +679 -0
  332. package/source/utils/logging/correlation.ts +474 -0
  333. package/source/utils/logging/formatters.spec.ts +464 -0
  334. package/source/utils/logging/formatters.ts +207 -0
  335. package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
  336. package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
  337. package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
  338. package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
  339. package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
  340. package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
  341. package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
  342. package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
  343. package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
  344. package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
  345. package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
  346. package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
  347. package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
  348. package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
  349. package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
  350. package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
  351. package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
  352. package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
  353. package/source/utils/logging/health-monitor/index.ts +15 -0
  354. package/source/utils/logging/health-monitor/instances.ts +48 -0
  355. package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
  356. package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
  357. package/source/utils/logging/health-monitor/types.ts +126 -0
  358. package/source/utils/logging/index.spec.ts +284 -0
  359. package/source/utils/logging/index.ts +236 -0
  360. package/source/utils/logging/integration.spec.ts +441 -0
  361. package/source/utils/logging/log-method-factory.spec.ts +573 -0
  362. package/source/utils/logging/log-method-factory.ts +233 -0
  363. package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
  364. package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
  365. package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
  366. package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
  367. package/source/utils/logging/log-query/index.ts +23 -0
  368. package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
  369. package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
  370. package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
  371. package/source/utils/logging/log-query/query/query-builder.ts +151 -0
  372. package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
  373. package/source/utils/logging/log-query/query/query-engine.ts +45 -0
  374. package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
  375. package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
  376. package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
  377. package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
  378. package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
  379. package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
  380. package/source/utils/logging/log-query/types.ts +163 -0
  381. package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
  382. package/source/utils/logging/log-query/utils/helpers.ts +72 -0
  383. package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
  384. package/source/utils/logging/log-query/utils/sorting.ts +61 -0
  385. package/source/utils/logging/logger-provider.spec.ts +262 -0
  386. package/source/utils/logging/logger-provider.ts +362 -0
  387. package/source/utils/logging/performance.spec.ts +209 -0
  388. package/source/utils/logging/performance.ts +757 -0
  389. package/source/utils/logging/pino-logger.spec.ts +425 -0
  390. package/source/utils/logging/pino-logger.ts +514 -0
  391. package/source/utils/logging/redaction.spec.ts +490 -0
  392. package/source/utils/logging/redaction.ts +267 -0
  393. package/source/utils/logging/request-tracker.spec.ts +1198 -0
  394. package/source/utils/logging/request-tracker.ts +803 -0
  395. package/source/utils/logging/transports.spec.ts +505 -0
  396. package/source/utils/logging/transports.ts +305 -0
  397. package/source/utils/logging/types.ts +216 -0
  398. package/source/utils/message-builder.spec.ts +179 -0
  399. package/source/utils/message-builder.ts +101 -0
  400. package/source/utils/message-queue.tsx +486 -0
  401. package/source/utils/paste-detection.spec.ts +69 -0
  402. package/source/utils/paste-detection.ts +124 -0
  403. package/source/utils/paste-roundtrip.spec.ts +442 -0
  404. package/source/utils/paste-utils.spec.ts +128 -0
  405. package/source/utils/paste-utils.ts +52 -0
  406. package/source/utils/programming-language-helper.spec.ts +74 -0
  407. package/source/utils/programming-language-helper.ts +32 -0
  408. package/source/utils/prompt-assembly.spec.ts +221 -0
  409. package/source/utils/prompt-processor.ts +173 -0
  410. package/source/utils/tool-args-parser.spec.ts +136 -0
  411. package/source/utils/tool-args-parser.ts +54 -0
  412. package/source/utils/tool-cancellation.spec.ts +230 -0
  413. package/source/utils/tool-cancellation.ts +28 -0
  414. package/source/utils/tool-result-display.spec.tsx +469 -0
  415. package/source/utils/tool-result-display.tsx +90 -0
  416. package/source/utils/update-checker.spec.ts +383 -0
  417. package/source/utils/update-checker.ts +183 -0
  418. package/source/wizard/config-wizard.spec.tsx +103 -0
  419. package/source/wizard/config-wizard.tsx +382 -0
  420. package/source/wizard/steps/location-step.spec.tsx +186 -0
  421. package/source/wizard/steps/location-step.tsx +147 -0
  422. package/source/wizard/steps/mcp-step.spec.tsx +607 -0
  423. package/source/wizard/steps/mcp-step.tsx +632 -0
  424. package/source/wizard/steps/provider-step.spec.tsx +342 -0
  425. package/source/wizard/steps/provider-step.tsx +957 -0
  426. package/source/wizard/steps/summary-step.spec.tsx +749 -0
  427. package/source/wizard/steps/summary-step.tsx +228 -0
  428. package/source/wizard/templates/mcp-templates.spec.ts +613 -0
  429. package/source/wizard/templates/mcp-templates.ts +570 -0
  430. package/source/wizard/templates/provider-templates.spec.ts +152 -0
  431. package/source/wizard/templates/provider-templates.ts +485 -0
  432. package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
  433. package/source/wizard/utils/fetch-cloud-models.ts +223 -0
  434. package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
  435. package/source/wizard/utils/fetch-local-models.ts +192 -0
  436. package/source/wizard/validation-array.spec.ts +264 -0
  437. package/source/wizard/validation.spec.ts +373 -0
  438. package/source/wizard/validation.ts +232 -0
  439. package/source/app/prompts/main-prompt.md +0 -122
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Type definitions for models.dev API data structures
3
+ */
4
+
5
+ export type ModelsDevModel = {
6
+ id: string;
7
+ name: string;
8
+ release_date: string;
9
+ attachment: boolean;
10
+ reasoning: boolean;
11
+ temperature: boolean;
12
+ tool_call: boolean;
13
+ cost: {
14
+ input: number;
15
+ output: number;
16
+ cache_read?: number;
17
+ cache_write?: number;
18
+ };
19
+ limit: {
20
+ context: number;
21
+ output: number;
22
+ };
23
+ modalities?: {
24
+ input: Array<'text' | 'audio' | 'image' | 'video' | 'pdf'>;
25
+ output: Array<'text' | 'audio' | 'image' | 'video' | 'pdf'>;
26
+ };
27
+ experimental?: boolean;
28
+ status?: 'alpha' | 'beta' | 'deprecated';
29
+ options: Record<string, unknown>;
30
+ headers?: Record<string, string>;
31
+ provider?: {npm: string};
32
+ };
33
+
34
+ export type ModelsDevProvider = {
35
+ api?: string;
36
+ name: string;
37
+ env: string[];
38
+ id: string;
39
+ npm?: string;
40
+ models: Record<string, ModelsDevModel>;
41
+ };
42
+
43
+ export type ModelsDevDatabase = Record<string, ModelsDevProvider>;
44
+
45
+ /**
46
+ * Cached models data with metadata
47
+ */
48
+ export interface CachedModelsData {
49
+ data: ModelsDevDatabase;
50
+ fetchedAt: number;
51
+ expiresAt: number;
52
+ }
53
+
54
+ /**
55
+ * Model lookup result
56
+ */
57
+ export interface ModelInfo {
58
+ id: string;
59
+ name: string;
60
+ provider: string;
61
+ contextLimit: number;
62
+ outputLimit: number;
63
+ supportsToolCalls: boolean;
64
+ cost: {
65
+ input: number;
66
+ output: number;
67
+ };
68
+ }
@@ -0,0 +1,155 @@
1
+ import { getClosestConfigFile } from '@/config/index';
2
+ import { MAX_PROMPT_HISTORY_SIZE } from '@/constants';
3
+ import { logError } from '@/utils/message-queue';
4
+ import fs from 'fs/promises';
5
+ import type { InputState } from './types/hooks';
6
+
7
+ const HISTORY_FILE = getClosestConfigFile('.coder-history');
8
+ const ENTRY_SEPARATOR = '\n---ENTRY_SEPARATOR---\n';
9
+ const JSON_FORMAT_MARKER = '---JSON_FORMAT---';
10
+
11
+ class PromptHistory {
12
+ private history: InputState[] = [];
13
+ private currentIndex: number = -1;
14
+
15
+ async loadHistory(): Promise<void> {
16
+ try {
17
+ const content = await fs.readFile(HISTORY_FILE, 'utf8');
18
+
19
+ if (content.startsWith(JSON_FORMAT_MARKER)) {
20
+ // New JSON format with InputState objects
21
+ const jsonContent = content.slice(JSON_FORMAT_MARKER.length);
22
+ this.history = JSON.parse(jsonContent) as InputState[];
23
+ } else if (content.includes(ENTRY_SEPARATOR)) {
24
+ // Legacy format with separator - migrate to InputState
25
+ const stringEntries = content
26
+ .split(ENTRY_SEPARATOR)
27
+ .filter(entry => entry.trim() !== '');
28
+ this.history = this.migrateStringArrayToInputState(stringEntries);
29
+ } else {
30
+ // Very old format - single lines - migrate to InputState
31
+ const stringEntries = content
32
+ .split('\n')
33
+ .filter(line => line.trim() !== '');
34
+ this.history = this.migrateStringArrayToInputState(stringEntries);
35
+ }
36
+ this.currentIndex = -1;
37
+ } catch {
38
+ // File doesn't exist yet, start with empty history
39
+ this.history = [];
40
+ this.currentIndex = -1;
41
+ }
42
+ }
43
+
44
+ private migrateStringArrayToInputState(
45
+ stringEntries: string[],
46
+ ): InputState[] {
47
+ return stringEntries.map(entry => ({
48
+ displayValue: entry,
49
+ placeholderContent: {},
50
+ }));
51
+ }
52
+
53
+ async saveHistory(): Promise<void> {
54
+ try {
55
+ const jsonContent = JSON.stringify(this.history, null, 2);
56
+ await fs.writeFile(
57
+ HISTORY_FILE,
58
+ JSON_FORMAT_MARKER + jsonContent,
59
+ 'utf8',
60
+ );
61
+ } catch (error) {
62
+ // Silently fail to avoid disrupting the user experience
63
+ const errorMessage =
64
+ error instanceof Error ? error.message : 'Unknown error';
65
+ logError(`Failed to save prompt history: ${errorMessage}`);
66
+ }
67
+ }
68
+
69
+ addPrompt(inputState: InputState): void;
70
+ addPrompt(prompt: string): void;
71
+ addPrompt(input: InputState | string): void {
72
+ let inputState: InputState;
73
+
74
+ if (typeof input === 'string') {
75
+ const trimmed = input.trim();
76
+ if (!trimmed) return;
77
+ inputState = {
78
+ displayValue: trimmed,
79
+ placeholderContent: {},
80
+ };
81
+ } else {
82
+ if (!input.displayValue.trim()) return;
83
+ inputState = input;
84
+ }
85
+
86
+ // Remove duplicate if it exists (compare by displayValue)
87
+ const existingIndex = this.history.findIndex(
88
+ entry => entry.displayValue === inputState.displayValue,
89
+ );
90
+ if (existingIndex !== -1) {
91
+ this.history.splice(existingIndex, 1);
92
+ }
93
+
94
+ // Add to the end
95
+ this.history.push(inputState);
96
+
97
+ // Keep only the last MAX_PROMPT_HISTORY_SIZE entries
98
+ if (this.history.length > MAX_PROMPT_HISTORY_SIZE) {
99
+ this.history = this.history.slice(-MAX_PROMPT_HISTORY_SIZE);
100
+ }
101
+
102
+ this.currentIndex = -1;
103
+ void this.saveHistory(); // Fire and forget
104
+ }
105
+
106
+ getPrevious(): InputState | null {
107
+ if (this.history.length === 0) return null;
108
+
109
+ if (this.currentIndex === -1) {
110
+ this.currentIndex = this.history.length - 1;
111
+ } else if (this.currentIndex > 0) {
112
+ this.currentIndex--;
113
+ }
114
+
115
+ return this.history[this.currentIndex] ?? null;
116
+ }
117
+
118
+ getNext(): InputState | null {
119
+ if (this.history.length === 0 || this.currentIndex === -1) return null;
120
+
121
+ if (this.currentIndex < this.history.length - 1) {
122
+ this.currentIndex++;
123
+ return this.history[this.currentIndex] ?? null;
124
+ } else {
125
+ this.currentIndex = -1;
126
+ return null; // Changed from empty string to null for consistency
127
+ }
128
+ }
129
+
130
+ // Legacy methods for backward compatibility
131
+ getPreviousString(): string | null {
132
+ const result = this.getPrevious();
133
+ return result?.displayValue ?? null;
134
+ }
135
+
136
+ getNextString(): string | null {
137
+ const result = this.getNext();
138
+ return result?.displayValue ?? '';
139
+ }
140
+
141
+ resetIndex(): void {
142
+ this.currentIndex = -1;
143
+ }
144
+
145
+ getHistory(): InputState[] {
146
+ return [...this.history];
147
+ }
148
+
149
+ // Legacy method for backward compatibility
150
+ getHistoryStrings(): string[] {
151
+ return this.history.map(entry => entry.displayValue);
152
+ }
153
+ }
154
+
155
+ export const promptHistory = new PromptHistory();
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Security tests for command injection vulnerabilities
3
+ * Tests that special characters in user input don't cause command injection
4
+ */
5
+ import test from 'ava';
6
+ import {execFileSync} from 'child_process';
7
+ import {mkdirSync, rmSync, writeFileSync} from 'fs';
8
+ import {join} from 'path';
9
+ import {tmpdir} from 'os';
10
+
11
+ console.log('\ncommand-injection.spec.ts');
12
+
13
+ // Test for server-discovery.ts - findCommand function
14
+ test('server-discovery: findCommand handles commands with shell metacharacters', t => {
15
+ // These characters should not break out of the command context
16
+ const dangerousCommands = [
17
+ 'test; rm -rf /',
18
+ 'test && echo hacked',
19
+ 'test | cat /etc/passwd',
20
+ 'test`whoami`',
21
+ 'test$(whoami)',
22
+ 'test\nrm -rf /',
23
+ 'test&amp;echo pwned',
24
+ ];
25
+
26
+ for (const cmd of dangerousCommands) {
27
+ // Should not throw or execute the injected commands
28
+ t.notThrows(() => {
29
+ try {
30
+ execFileSync('which', [cmd], {stdio: 'ignore'});
31
+ } catch {
32
+ // Expected to fail - command doesn't exist
33
+ }
34
+ });
35
+ }
36
+
37
+ t.pass('Commands with metacharacters handled safely');
38
+ });
39
+
40
+ // Test for find-files.tsx - file pattern handling
41
+ test('find-files: handles file patterns with shell metacharacters', async t => {
42
+ const testDir = join(tmpdir(), `coder-test-${Date.now()}`);
43
+
44
+ try {
45
+ // Create test directory structure
46
+ mkdirSync(testDir, {recursive: true});
47
+ mkdirSync(join(testDir, 'safe'), {recursive: true});
48
+ writeFileSync(join(testDir, 'safe', 'test.txt'), 'safe file');
49
+
50
+ // Test patterns that could be dangerous if not properly escaped
51
+ const dangerousPatterns = [
52
+ '*.txt; rm -rf /',
53
+ '*.txt && echo hacked',
54
+ '*.txt | cat /etc/passwd',
55
+ '*.txt`whoami`',
56
+ '*.txt$(whoami)',
57
+ "*.txt' || echo vulnerable",
58
+ '*.txt" || echo vulnerable',
59
+ ];
60
+
61
+ const {execFile} = await import('node:child_process');
62
+ const {promisify} = await import('node:util');
63
+ const execFileAsync = promisify(execFile);
64
+
65
+ for (const pattern of dangerousPatterns) {
66
+ // Build find arguments array (same as the fixed code)
67
+ const findArgs = ['.', '-name', pattern];
68
+
69
+ // Should not execute injected commands
70
+ try {
71
+ await execFileAsync('find', findArgs, {
72
+ cwd: testDir,
73
+ timeout: 1000,
74
+ });
75
+ } catch (error: unknown) {
76
+ // Expected to fail or find nothing - that's fine
77
+ // What matters is it doesn't execute injected commands
78
+ }
79
+ }
80
+
81
+ t.pass('File patterns with metacharacters handled safely');
82
+ } finally {
83
+ // Cleanup
84
+ try {
85
+ rmSync(testDir, {recursive: true, force: true});
86
+ } catch {
87
+ // Ignore cleanup errors
88
+ }
89
+ }
90
+ });
91
+
92
+ // Test for search-file-contents.tsx - search query handling
93
+ test('search-file-contents: handles search queries with shell metacharacters', async t => {
94
+ const testDir = join(tmpdir(), `coder-test-${Date.now()}`);
95
+
96
+ try {
97
+ // Create test directory with a file to search
98
+ mkdirSync(testDir, {recursive: true});
99
+ writeFileSync(join(testDir, 'test.txt'), 'hello world\ntest content');
100
+
101
+ // Test queries that could be dangerous if not properly escaped
102
+ const dangerousQueries = [
103
+ 'test; rm -rf /',
104
+ 'test && echo hacked',
105
+ 'test | cat /etc/passwd',
106
+ 'test`whoami`',
107
+ 'test$(whoami)',
108
+ "test' || echo vulnerable",
109
+ 'test" || echo vulnerable',
110
+ 'test\nrm -rf /',
111
+ ];
112
+
113
+ const {execFile} = await import('node:child_process');
114
+ const {promisify} = await import('node:util');
115
+ const execFileAsync = promisify(execFile);
116
+
117
+ for (const query of dangerousQueries) {
118
+ // Build grep arguments array (same as the fixed code)
119
+ const grepArgs = ['-rn', '-E', '-i', '--include=*', query, '.'];
120
+
121
+ // Should not execute injected commands
122
+ try {
123
+ await execFileAsync('grep', grepArgs, {
124
+ cwd: testDir,
125
+ timeout: 1000,
126
+ });
127
+ } catch (error: unknown) {
128
+ // Expected to fail or find nothing - that's fine
129
+ // What matters is it doesn't execute injected commands
130
+ }
131
+ }
132
+
133
+ t.pass('Search queries with metacharacters handled safely');
134
+ } finally {
135
+ // Cleanup
136
+ try {
137
+ rmSync(testDir, {recursive: true, force: true});
138
+ } catch {
139
+ // Ignore cleanup errors
140
+ }
141
+ }
142
+ });
143
+
144
+ // Test that special regex characters are handled correctly
145
+ test('search-file-contents: handles regex special characters correctly', async t => {
146
+ const testDir = join(tmpdir(), `coder-test-${Date.now()}`);
147
+
148
+ try {
149
+ mkdirSync(testDir, {recursive: true});
150
+ writeFileSync(join(testDir, 'test.txt'), 'function test() {}');
151
+
152
+ const {execFile} = await import('node:child_process');
153
+ const {promisify} = await import('node:util');
154
+ const execFileAsync = promisify(execFile);
155
+
156
+ // Regex patterns that should work correctly
157
+ const regexPatterns = [
158
+ 'function.*test',
159
+ 'test\\(\\)',
160
+ '\\w+\\s+test',
161
+ ];
162
+
163
+ for (const pattern of regexPatterns) {
164
+ const grepArgs = ['-rn', '-E', '-i', '--include=*', pattern, '.'];
165
+
166
+ // Should handle regex patterns correctly
167
+ try {
168
+ const {stdout} = await execFileAsync('grep', grepArgs, {
169
+ cwd: testDir,
170
+ timeout: 1000,
171
+ });
172
+ // If it finds matches, that's good
173
+ t.truthy(stdout !== undefined);
174
+ } catch (error: unknown) {
175
+ // If grep exits with code 1 (no matches), that's also fine
176
+ if (
177
+ error instanceof Error &&
178
+ 'code' in error &&
179
+ error.code === 1
180
+ ) {
181
+ t.pass();
182
+ }
183
+ }
184
+ }
185
+
186
+ t.pass('Regex patterns handled correctly');
187
+ } finally {
188
+ // Cleanup
189
+ try {
190
+ rmSync(testDir, {recursive: true, force: true});
191
+ } catch {
192
+ // Ignore cleanup errors
193
+ }
194
+ }
195
+ });
196
+
197
+ // Test that the escaping removed from search-file-contents was necessary
198
+ test('search-file-contents: previous escaping method was insufficient', t => {
199
+ // This demonstrates why the old escaping method was vulnerable
200
+ const dangerousQuery = 'test"; rm -rf /';
201
+
202
+ // Old method (insufficient): only escapes double quotes
203
+ const oldEscaped = dangerousQuery.replace(/"/g, '\\"');
204
+ // Result: 'test\"; rm -rf /' - still vulnerable when used in shell command
205
+
206
+ // The old approach would create: grep "test\"; rm -rf /" .
207
+ // The semicolon would still be interpreted by the shell
208
+
209
+ // New method: uses array-based arguments, no escaping needed
210
+ // grep receives exactly: ['test"; rm -rf /'] as a literal string
211
+ // The shell never interprets the semicolon
212
+
213
+ t.not(oldEscaped, dangerousQuery);
214
+ t.true(oldEscaped.includes(';'), 'Old escaping leaves semicolon unescaped');
215
+ t.pass('Demonstrated why old escaping was insufficient');
216
+ });
217
+
218
+ // Integration test: verify the actual functions handle injection safely
219
+ test('integration: all fixed functions use array-based arguments', t => {
220
+ // This test verifies that the fixed code uses execFileSync/execFileAsync
221
+ // with array-based arguments instead of shell string interpolation
222
+
223
+ // The key insight: when using execFile/execFileSync with an array,
224
+ // the shell never interprets the arguments, preventing injection
225
+
226
+ const testCommand = 'echo';
227
+ const testArgs = ['hello; rm -rf /'];
228
+
229
+ // This is safe - 'rm -rf /' is never executed
230
+ const result = execFileSync(testCommand, testArgs, {
231
+ encoding: 'utf8',
232
+ });
233
+
234
+ // The output literally contains the semicolon and command
235
+ t.true(result.includes(';'));
236
+ t.true(result.includes('rm -rf /'));
237
+
238
+ // If shell interpretation happened, we wouldn't see these in the output
239
+ t.pass('Array-based arguments prevent shell interpretation');
240
+ });