@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,228 @@
1
+ import { constants, existsSync } from 'node:fs';
2
+ import { access, readFile, writeFile } from 'node:fs/promises';
3
+ import { dirname, resolve } from 'node:path';
4
+ import { highlight } from 'cli-highlight';
5
+ import { Box, Text } from 'ink';
6
+ import React from 'react';
7
+
8
+ import ToolMessage from '@/components/tool-message';
9
+ import { getCurrentMode } from '@/context/mode-context';
10
+ import { ThemeContext } from '@/hooks/useTheme';
11
+ import { jsonSchema, tool } from '@/types/core';
12
+ import { getCachedFileContent, invalidateCache } from '@/utils/file-cache';
13
+ import { normalizeIndentation } from '@/utils/indentation-normalizer';
14
+ import { getLanguageFromExtension } from '@/utils/programming-language-helper';
15
+
16
+
17
+ const executeWriteFile = async (args: {
18
+ path: string;
19
+ content: string;
20
+ }): Promise<string> => {
21
+ const absPath = resolve(args.path);
22
+ const fileExists = existsSync(absPath);
23
+
24
+ await writeFile(absPath, args.content, 'utf-8');
25
+
26
+ // Invalidate cache after write
27
+ invalidateCache(absPath);
28
+
29
+ // Read back to verify and show actual content
30
+ const actualContent = await readFile(absPath, 'utf-8');
31
+ const lines = actualContent.split('\n');
32
+ const lineCount = lines.length;
33
+ const charCount = actualContent.length;
34
+ const estimatedTokens = Math.ceil(charCount / 4);
35
+
36
+ // Generate full file contents to show the model the current file state
37
+ let fileContext = '\n\nFile contents after write:\n';
38
+ for (let i = 0; i < lines.length; i++) {
39
+ const lineNumStr = String(i + 1).padStart(4, ' ');
40
+ const line = lines[i] || '';
41
+ fileContext += `${lineNumStr}: ${line}\n`;
42
+ }
43
+
44
+ const action = fileExists ? 'overwritten' : 'written';
45
+ return `File ${action} successfully (${lineCount} lines, ${charCount} characters, ~${estimatedTokens} tokens).${fileContext}`;
46
+ };
47
+
48
+ const writeFileCoreTool = tool({
49
+ description:
50
+ 'Write content to a file (creates new file or overwrites existing file). Use this for complete file rewrites, generated code, or when most of the file needs to change. For small targeted edits, use string_replace instead.',
51
+ inputSchema: jsonSchema<{ path: string; content: string }>({
52
+ type: 'object',
53
+ properties: {
54
+ path: {
55
+ type: 'string',
56
+ description: 'The path to the file to write.',
57
+ },
58
+ content: {
59
+ type: 'string',
60
+ description: 'The complete content to write to the file.',
61
+ },
62
+ },
63
+ required: ['path', 'content'],
64
+ }),
65
+ // Medium risk: file write operation, requires approval except in auto-accept mode
66
+ needsApproval: () => {
67
+ const mode = getCurrentMode();
68
+ return mode !== 'auto-accept'; // true in normal/plan, false in auto-accept
69
+ },
70
+ execute: async (args, _options) => {
71
+ return await executeWriteFile(args);
72
+ },
73
+ });
74
+
75
+ interface WriteFileArgs {
76
+ path?: string;
77
+ file_path?: string;
78
+ content?: string;
79
+ }
80
+
81
+ // Create a component that will re-render when theme changes
82
+ const WriteFileFormatter = React.memo(({ args }: { args: WriteFileArgs }) => {
83
+ const themeContext = React.useContext(ThemeContext);
84
+ if (!themeContext) {
85
+ throw new Error('ThemeContext is required');
86
+ }
87
+ const { colors } = themeContext;
88
+ const path = args.path || args.file_path || 'unknown';
89
+ const newContent = args.content || '';
90
+ const lineCount = newContent.split('\n').length;
91
+ const charCount = newContent.length;
92
+
93
+ // Estimate tokens (rough approximation: ~4 characters per token)
94
+ const estimatedTokens = Math.ceil(charCount / 4);
95
+
96
+ // Normalize indentation for display
97
+ const lines = newContent.split('\n');
98
+ const normalizedLines = normalizeIndentation(lines);
99
+
100
+ const messageContent = (
101
+ <Box flexDirection="column">
102
+ <Text color={colors.tool}>☕︎ write_file</Text>
103
+
104
+ <Box>
105
+ <Text color={colors.secondary}>Path: </Text>
106
+ <Text color={colors.white}>{path}</Text>
107
+ </Box>
108
+ <Box>
109
+ <Text color={colors.secondary}>Size: </Text>
110
+ <Text color={colors.white}>
111
+ {lineCount} lines, {charCount} characters (~{estimatedTokens} tokens)
112
+ </Text>
113
+ </Box>
114
+
115
+ {newContent.length > 0 ? (
116
+ <Box flexDirection="column" marginTop={1}>
117
+ <Text color={colors.white}>File content:</Text>
118
+ {normalizedLines.slice(0, 50).map((line: string, i: number) => {
119
+ const lineNumStr = String(i + 1).padStart(4, ' ');
120
+ const ext = path.split('.').pop()?.toLowerCase() ?? '';
121
+ const language = getLanguageFromExtension(ext);
122
+
123
+ try {
124
+ const highlighted = highlight(line, { language, theme: 'default' });
125
+ return (
126
+ <Box key={i}>
127
+ <Text color={colors.secondary}>{lineNumStr} </Text>
128
+ <Text wrap="wrap">{highlighted}</Text>
129
+ </Box>
130
+ );
131
+ } catch {
132
+ return (
133
+ <Box key={i}>
134
+ <Text color={colors.secondary}>{lineNumStr} </Text>
135
+ <Text wrap="wrap">{line}</Text>
136
+ </Box>
137
+ );
138
+ }
139
+ })}
140
+ {normalizedLines.length > 50 && (
141
+ <Box marginTop={0}>
142
+ <Text color={colors.secondary}>
143
+ ... {normalizedLines.length - 50} more lines (truncated for display)
144
+ </Text>
145
+ </Box>
146
+ )}
147
+ </Box>
148
+ ) : (
149
+ <Box marginTop={1}>
150
+ <Text color={colors.secondary}>File will be empty</Text>
151
+ </Box>
152
+ )}
153
+ </Box>
154
+ );
155
+
156
+ return <ToolMessage message={messageContent} hideBox={true} />;
157
+ });
158
+
159
+
160
+
161
+ const writeFileFormatter = async (
162
+ args: WriteFileArgs,
163
+ result?: string,
164
+ ): Promise<React.ReactElement> => {
165
+ const path = args.path || args.file_path || '';
166
+ const absPath = resolve(path);
167
+
168
+ // VS Code preview logic removed
169
+
170
+ return <WriteFileFormatter args={args} />;
171
+ };
172
+
173
+ const writeFileValidator = async (args: {
174
+ path: string;
175
+ content: string;
176
+ }): Promise<{ valid: true } | { valid: false; error: string }> => {
177
+ const absPath = resolve(args.path);
178
+
179
+ // Check if parent directory exists
180
+ const parentDir = dirname(absPath);
181
+ try {
182
+ await access(parentDir, constants.F_OK);
183
+ } catch (error) {
184
+ if (error && typeof error === 'object' && 'code' in error) {
185
+ if (error.code === 'ENOENT') {
186
+ return {
187
+ valid: false,
188
+ error: `☕︎ Parent directory does not exist: "${parentDir}"`,
189
+ };
190
+ }
191
+ }
192
+ const errorMessage =
193
+ error instanceof Error ? error.message : 'Unknown error';
194
+ return {
195
+ valid: false,
196
+ error: `☕︎ Cannot access parent directory "${parentDir}": ${errorMessage}`,
197
+ };
198
+ }
199
+
200
+ // Check for invalid path characters or attempts to write to system directories
201
+ const invalidPatterns = [
202
+ /^\/etc\//i,
203
+ /^\/sys\//i,
204
+ /^\/proc\//i,
205
+ /^\/dev\//i,
206
+ /^\/boot\//i,
207
+ /^C:\\Windows\\/i,
208
+ /^C:\\Program Files\\/i,
209
+ ];
210
+
211
+ for (const pattern of invalidPatterns) {
212
+ if (pattern.test(absPath)) {
213
+ return {
214
+ valid: false,
215
+ error: `☕︎ Cannot write files to system directory: "${args.path}"`,
216
+ };
217
+ }
218
+ }
219
+
220
+ return { valid: true };
221
+ };
222
+
223
+ export const writeFileTool = {
224
+ name: 'write_file' as const,
225
+ tool: writeFileCoreTool,
226
+ formatter: writeFileFormatter,
227
+ validator: writeFileValidator,
228
+ };
@@ -0,0 +1,37 @@
1
+ import {CustomCommandExecutor} from '@/custom-commands/executor';
2
+ import {CustomCommandLoader} from '@/custom-commands/loader';
3
+ import React from 'react';
4
+ import type {CheckpointListItem} from './checkpoint';
5
+ import type {CustomCommand} from './commands';
6
+ import type {Message} from './core';
7
+ import type {UpdateInfo} from './utils';
8
+
9
+ export interface MessageSubmissionOptions {
10
+ customCommandCache: Map<string, CustomCommand>;
11
+ customCommandLoader: CustomCommandLoader | null;
12
+ customCommandExecutor: CustomCommandExecutor | null;
13
+ onClearMessages: () => Promise<void>;
14
+ onEnterModelSelectionMode: () => void;
15
+ onEnterProviderSelectionMode: () => void;
16
+ onEnterThemeSelectionMode: () => void;
17
+ onEnterModelDatabaseMode: () => void;
18
+ onEnterConfigWizardMode: () => void;
19
+ onEnterCheckpointLoadMode: (
20
+ checkpoints: CheckpointListItem[],
21
+ currentMessageCount: number,
22
+ ) => void;
23
+ onShowStatus: () => void;
24
+ onHandleChatMessage: (message: string) => Promise<void>;
25
+ onAddToChatQueue: (component: React.ReactNode) => void;
26
+ onCommandComplete?: () => void;
27
+ componentKeyCounter: number;
28
+ setMessages: (messages: Message[]) => void;
29
+ messages: Message[];
30
+ setIsBashExecuting: (executing: boolean) => void;
31
+ setCurrentBashCommand: (command: string) => void;
32
+ provider: string;
33
+ model: string;
34
+ theme: string;
35
+ updateInfo: UpdateInfo | null;
36
+ getMessageTokens: (message: Message) => number;
37
+ }
@@ -0,0 +1,48 @@
1
+ import type {Message} from '@/types/core';
2
+
3
+ export interface CheckpointMetadata {
4
+ name: string;
5
+ timestamp: string; // ISO 8601 format
6
+ messageCount: number;
7
+ filesChanged: string[]; // Relative file paths
8
+ provider: {
9
+ name: string;
10
+ model: string;
11
+ };
12
+ description?: string; // Optional: first message or custom
13
+ gitCommitHash?: string; // Optional: for future git integration
14
+ }
15
+
16
+ export interface CheckpointConversation {
17
+ messages: Message[];
18
+ toolExecutions?: Array<{
19
+ tool: string;
20
+ args: Record<string, unknown>;
21
+ result: unknown;
22
+ timestamp: string;
23
+ }>;
24
+ }
25
+
26
+ export interface CheckpointData {
27
+ metadata: CheckpointMetadata;
28
+ conversation: CheckpointConversation;
29
+ fileSnapshots: Map<string, string>;
30
+ }
31
+
32
+ export interface CheckpointListItem {
33
+ name: string;
34
+ metadata: CheckpointMetadata;
35
+ sizeBytes?: number;
36
+ }
37
+
38
+ export interface CheckpointValidationResult {
39
+ valid: boolean;
40
+ errors: string[];
41
+ warnings?: string[];
42
+ }
43
+
44
+ export interface CheckpointRestoreOptions {
45
+ createBackup?: boolean;
46
+ backupName?: string;
47
+ validateIntegrity?: boolean;
48
+ }
@@ -0,0 +1,46 @@
1
+ import {Message} from '@/types/core';
2
+
3
+ export interface Command<T = React.ReactElement> {
4
+ name: string;
5
+ description: string;
6
+ handler: (
7
+ args: string[],
8
+ messages: Message[],
9
+ metadata: {
10
+ provider: string;
11
+ model: string;
12
+ tokens: number;
13
+ getMessageTokens: (message: Message) => number;
14
+ },
15
+ ) => Promise<T>;
16
+ }
17
+
18
+ export interface ParsedCommand {
19
+ isCommand: boolean;
20
+ command?: string;
21
+ args?: string[];
22
+ fullCommand?: string;
23
+ // Bash command properties
24
+ isBashCommand?: boolean;
25
+ bashCommand?: string;
26
+ }
27
+
28
+ export interface CustomCommandMetadata {
29
+ description?: string;
30
+ aliases?: string[];
31
+ parameters?: string[];
32
+ }
33
+
34
+ export interface CustomCommand {
35
+ name: string;
36
+ path: string;
37
+ namespace?: string;
38
+ fullName: string; // e.g., "refactor:dry" or just "test"
39
+ metadata: CustomCommandMetadata;
40
+ content: string; // The markdown content without frontmatter
41
+ }
42
+
43
+ export interface ParsedCustomCommand {
44
+ metadata: CustomCommandMetadata;
45
+ content: string;
46
+ }
@@ -0,0 +1,27 @@
1
+ import {ReactNode} from 'react';
2
+
3
+ export interface AssistantMessageProps {
4
+ message: string;
5
+ model: string;
6
+ }
7
+
8
+ export interface BashExecutionIndicatorProps {
9
+ command: string;
10
+ }
11
+
12
+ export interface ChatQueueProps {
13
+ staticComponents?: ReactNode[];
14
+ queuedComponents?: ReactNode[];
15
+ }
16
+
17
+ export type Completion = {name: string; isCustom: boolean};
18
+
19
+ export interface ToolExecutionIndicatorProps {
20
+ toolName: string;
21
+ currentIndex: number;
22
+ totalTools: number;
23
+ }
24
+
25
+ export interface UserMessageProps {
26
+ message: string;
27
+ }
@@ -0,0 +1,103 @@
1
+ import type {ThemePreset} from '@/types/ui';
2
+
3
+ // AI provider configurations (OpenAI-compatible)
4
+ export interface AIProviderConfig {
5
+ name: string;
6
+ type: string;
7
+ models: string[];
8
+ requestTimeout?: number;
9
+ socketTimeout?: number;
10
+ maxRetries?: number; // Maximum number of retries for failed requests (default: 2)
11
+ connectionPool?: {
12
+ idleTimeout?: number;
13
+ cumulativeMaxIdleTimeout?: number;
14
+ };
15
+ config: {
16
+ baseURL?: string;
17
+ apiKey?: string;
18
+ [key: string]: unknown;
19
+ };
20
+ }
21
+
22
+ // Provider configuration type for wizard and config building
23
+ export interface ProviderConfig {
24
+ name: string;
25
+ baseUrl?: string;
26
+ apiKey?: string;
27
+ models: string[];
28
+ requestTimeout?: number;
29
+ socketTimeout?: number;
30
+ maxRetries?: number; // Maximum number of retries for failed requests (default: 2)
31
+ organizationId?: string;
32
+ timeout?: number;
33
+ connectionPool?: {
34
+ idleTimeout?: number;
35
+ cumulativeMaxIdleTimeout?: number;
36
+ };
37
+ [key: string]: unknown; // Allow additional provider-specific config
38
+ }
39
+
40
+ export interface AppConfig {
41
+ // Providers array structure - all OpenAI compatible
42
+ providers?: {
43
+ name: string;
44
+ baseUrl?: string;
45
+ apiKey?: string;
46
+ models: string[];
47
+ requestTimeout?: number;
48
+ socketTimeout?: number;
49
+ maxRetries?: number; // Maximum number of retries for failed requests (default: 2)
50
+ connectionPool?: {
51
+ idleTimeout?: number;
52
+ cumulativeMaxIdleTimeout?: number;
53
+ };
54
+ [key: string]: unknown; // Allow additional provider-specific config
55
+ }[];
56
+
57
+ mcpServers?: {
58
+ name: string;
59
+ transport: 'stdio' | 'websocket' | 'http';
60
+ command?: string;
61
+ args?: string[];
62
+ env?: Record<string, string>;
63
+ url?: string;
64
+ headers?: Record<string, string>;
65
+ auth?: {
66
+ type: 'bearer' | 'basic' | 'api-key' | 'custom';
67
+ token?: string;
68
+ username?: string;
69
+ password?: string;
70
+ apiKey?: string;
71
+ customHeaders?: Record<string, string>;
72
+ };
73
+ timeout?: number;
74
+ reconnect?: {
75
+ enabled: boolean;
76
+ maxAttempts: number;
77
+ backoffMs: number;
78
+ };
79
+ description?: string;
80
+ tags?: string[];
81
+ enabled?: boolean;
82
+ }[];
83
+
84
+ // LSP server configurations (optional - auto-discovery enabled by default)
85
+ lspServers?: {
86
+ name: string;
87
+ command: string;
88
+ args?: string[];
89
+ languages: string[]; // File extensions this server handles
90
+ env?: Record<string, string>;
91
+ }[];
92
+ }
93
+
94
+ export interface UserPreferences {
95
+ lastProvider?: string;
96
+ lastModel?: string;
97
+ providerModels?: {
98
+ [key in string]?: string;
99
+ };
100
+ lastUpdateCheck?: number;
101
+ selectedTheme?: ThemePreset;
102
+ trustedDirectories?: string[];
103
+ }
@@ -0,0 +1,67 @@
1
+ import type {
2
+ ConnectionStatus,
3
+ LSPConnectionStatus,
4
+ MCPConnectionStatus,
5
+ } from '@/types/core';
6
+ import test from 'ava';
7
+
8
+ test('MCPConnectionStatus type structure', t => {
9
+ const status: MCPConnectionStatus = {
10
+ name: 'test-server',
11
+ status: 'connected',
12
+ };
13
+
14
+ t.is(status.name, 'test-server');
15
+ t.is(status.status, 'connected');
16
+ t.is(status.errorMessage, undefined);
17
+ });
18
+
19
+ test('MCPConnectionStatus with error', t => {
20
+ const status: MCPConnectionStatus = {
21
+ name: 'failed-server',
22
+ status: 'failed',
23
+ errorMessage: 'Connection timeout',
24
+ };
25
+
26
+ t.is(status.name, 'failed-server');
27
+ t.is(status.status, 'failed');
28
+ t.is(status.errorMessage, 'Connection timeout');
29
+ });
30
+
31
+ test('LSPConnectionStatus type structure', t => {
32
+ const status: LSPConnectionStatus = {
33
+ name: 'ts-language-server',
34
+ status: 'connected',
35
+ };
36
+
37
+ t.is(status.name, 'ts-language-server');
38
+ t.is(status.status, 'connected');
39
+ t.is(status.errorMessage, undefined);
40
+ });
41
+
42
+ test('ConnectionStatus union type', t => {
43
+ const validStatuses: ConnectionStatus[] = ['connected', 'failed', 'pending'];
44
+
45
+ validStatuses.forEach(status => {
46
+ t.true(['connected', 'failed', 'pending'].includes(status));
47
+ });
48
+ });
49
+
50
+ test('Connection status filtering', t => {
51
+ const mcpStatuses: MCPConnectionStatus[] = [
52
+ {name: 'server1', status: 'connected'},
53
+ {name: 'server2', status: 'failed', errorMessage: 'Timeout'},
54
+ {name: 'server3', status: 'pending'},
55
+ ];
56
+
57
+ const connected = mcpStatuses.filter(s => s.status === 'connected');
58
+ const failed = mcpStatuses.filter(s => s.status === 'failed');
59
+ const pending = mcpStatuses.filter(s => s.status === 'pending');
60
+
61
+ t.is(connected.length, 1);
62
+ t.is(failed.length, 1);
63
+ t.is(pending.length, 1);
64
+ t.is(connected[0].name, 'server1');
65
+ t.is(failed[0].errorMessage, 'Timeout');
66
+ t.is(pending[0].name, 'server3');
67
+ });