@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,387 @@
1
+ import { constants } from 'node:fs';
2
+ import { access } from 'node:fs/promises';
3
+ import { resolve } from 'node:path';
4
+ import ToolMessage from '@/components/tool-message';
5
+ import {
6
+ CHARS_PER_TOKEN_ESTIMATE,
7
+ FILE_READ_CHUNKING_HINT_THRESHOLD_LINES,
8
+ FILE_READ_CHUNK_SIZE_LINES,
9
+ FILE_READ_METADATA_THRESHOLD_LINES,
10
+ } from '@/constants';
11
+ import { ThemeContext } from '@/hooks/useTheme';
12
+ import { jsonSchema, tool } from '@/types/core';
13
+ import type { CoderToolExport } from '@/types/core';
14
+ import { getCachedFileContent } from '@/utils/file-cache';
15
+ import { Box, Text } from 'ink';
16
+ import React from 'react';
17
+
18
+ const executeReadFile = async (args: {
19
+ path: string;
20
+ start_line?: number;
21
+ end_line?: number;
22
+ }): Promise<string> => {
23
+ const absPath = resolve(args.path);
24
+
25
+ try {
26
+ const cached = await getCachedFileContent(absPath);
27
+ const content = cached.content;
28
+
29
+ // Check if file is empty (0 tokens)
30
+ if (content.length === 0) {
31
+ throw new Error(`File "${args.path}" exists but is empty (0 tokens)`);
32
+ }
33
+
34
+ const lines = cached.lines;
35
+ const totalLines = lines.length;
36
+ const fileSize = content.length;
37
+ const estimatedTokens = Math.ceil(fileSize / CHARS_PER_TOKEN_ESTIMATE);
38
+
39
+ // Progressive disclosure: metadata first for files >300 lines
40
+ // Small files can be read directly without ranges
41
+ if (
42
+ args.start_line === undefined &&
43
+ args.end_line === undefined &&
44
+ totalLines > FILE_READ_METADATA_THRESHOLD_LINES
45
+ ) {
46
+ // Return metadata only for medium/large files
47
+ // Detect file type from extension
48
+ const ext = absPath.split('.').pop() || '';
49
+ const typeMap: Record<string, string> = {
50
+ ts: 'TypeScript',
51
+ tsx: 'TypeScript React',
52
+ js: 'JavaScript',
53
+ jsx: 'JavaScript React',
54
+ py: 'Python',
55
+ go: 'Go',
56
+ rs: 'Rust',
57
+ java: 'Java',
58
+ cpp: 'C++',
59
+ c: 'C',
60
+ md: 'Markdown',
61
+ json: 'JSON',
62
+ yaml: 'YAML',
63
+ yml: 'YAML',
64
+ toml: 'TOML',
65
+ html: 'HTML',
66
+ css: 'CSS',
67
+ scss: 'SCSS',
68
+ sh: 'Shell',
69
+ bash: 'Bash',
70
+ };
71
+ const fileType = typeMap[ext] || ext.toUpperCase();
72
+
73
+ let output = `File: ${args.path}\n`;
74
+ output += `Type: ${fileType}\n`;
75
+ output += `Total lines: ${totalLines.toLocaleString()}\n`;
76
+ output += `Size: ${fileSize.toLocaleString()} bytes\n`;
77
+ output += `Estimated tokens: ~${estimatedTokens.toLocaleString()}\n\n`;
78
+
79
+ if (totalLines <= FILE_READ_CHUNKING_HINT_THRESHOLD_LINES) {
80
+ output += `[Medium file - To read specific sections, call read_file with start_line and end_line]\n`;
81
+ output += `[To read entire file progressively, make multiple calls:]\n`;
82
+ output += ` - read_file({path: "${args.path}", start_line: 1, end_line: ${FILE_READ_CHUNK_SIZE_LINES}})\n`;
83
+ output += ` - read_file({path: "${args.path}", start_line: ${FILE_READ_CHUNK_SIZE_LINES + 1}, end_line: ${totalLines}})\n`;
84
+ } else {
85
+ output += `[Large file - Choose one approach:]\n`;
86
+ output += `[1. Targeted read: Use search_files to find code, then read specific ranges]\n`;
87
+ output += `[2. Progressive read: Read file in chunks (recommended chunk size: 200-300 lines)]\n`;
88
+ output += ` Example chunks for ${totalLines} lines:\n`;
89
+ const chunkSize = FILE_READ_CHUNK_SIZE_LINES;
90
+ const numChunks = Math.ceil(totalLines / chunkSize);
91
+ for (let i = 0; i < Math.min(numChunks, 3); i++) {
92
+ const start = i * chunkSize + 1;
93
+ const end = Math.min((i + 1) * chunkSize, totalLines);
94
+ output += ` - read_file({path: "${args.path}", start_line: ${start}, end_line: ${end}})\n`;
95
+ }
96
+ if (numChunks > 3) {
97
+ output += ` ... and ${numChunks - 3
98
+ } more chunks to complete the file\n`;
99
+ }
100
+ }
101
+
102
+ return output;
103
+ }
104
+
105
+ // Line ranges specified - read and return content
106
+ const startLine = args.start_line ? Math.max(1, args.start_line) : 1;
107
+ const endLine = args.end_line
108
+ ? Math.min(totalLines, args.end_line)
109
+ : totalLines;
110
+
111
+ // Extract the lines to return
112
+ const linesToReturn = lines.slice(startLine - 1, endLine);
113
+
114
+ // Return content with line numbers for precise editing
115
+ let result = '';
116
+ for (let i = 0; i < linesToReturn.length; i++) {
117
+ const lineNum = String(startLine + i).padStart(4, ' ');
118
+ result += `${lineNum}: ${linesToReturn[i]}\n`;
119
+ }
120
+
121
+ return result.slice(0, -1); // Remove trailing newline
122
+ } catch (error: unknown) {
123
+ // Handle file not found and other filesystem errors
124
+ if (
125
+ error &&
126
+ typeof error === 'object' &&
127
+ 'code' in error &&
128
+ error.code === 'ENOENT'
129
+ ) {
130
+ throw new Error(`File "${args.path}" does not exist`);
131
+ }
132
+
133
+ // Re-throw other errors (including our empty file error)
134
+ throw error;
135
+ }
136
+ };
137
+
138
+ const readFileCoreTool = tool({
139
+ description:
140
+ 'Read file contents with line numbers. PROGRESSIVE DISCLOSURE: First call without line ranges returns metadata (size, lines, tokens). For files >300 lines, you MUST call again with start_line/end_line to read content. Small files (<300 lines) return content directly.',
141
+ inputSchema: jsonSchema<{
142
+ path: string;
143
+ start_line?: number;
144
+ end_line?: number;
145
+ }>({
146
+ type: 'object',
147
+ properties: {
148
+ path: {
149
+ type: 'string',
150
+ description: 'The path to the file to read.',
151
+ },
152
+ start_line: {
153
+ type: 'number',
154
+ description:
155
+ 'Optional: Line number to start reading from (1-indexed). Required for files >300 lines. Use with end_line to read specific range.',
156
+ },
157
+ end_line: {
158
+ type: 'number',
159
+ description:
160
+ 'Optional: Line number to stop reading at (inclusive). Required for files >300 lines. Use with start_line to read specific range.',
161
+ },
162
+ },
163
+ required: ['path'],
164
+ }),
165
+ // Low risk: read-only operation, never requires approval
166
+ needsApproval: false,
167
+ execute: async (args, _options) => {
168
+ return await executeReadFile(args);
169
+ },
170
+ });
171
+
172
+ // Create a component that will re-render when theme changes
173
+ const ReadFileFormatter = React.memo(
174
+ ({
175
+ args,
176
+ fileInfo,
177
+ }: {
178
+ args: {
179
+ path?: string;
180
+ file_path?: string;
181
+ start_line?: number;
182
+ end_line?: number;
183
+ };
184
+ fileInfo: {
185
+ totalLines: number;
186
+ readLines: number;
187
+ tokens: number;
188
+ isPartialRead: boolean;
189
+ isMetadataOnly: boolean;
190
+ };
191
+ }) => {
192
+ const themeContext = React.useContext(ThemeContext);
193
+ if (!themeContext) {
194
+ throw new Error('ReadFileFormatter must be used within a ThemeProvider');
195
+ }
196
+ const { colors } = themeContext;
197
+ const path = args.path || args.file_path || 'unknown';
198
+
199
+ const messageContent = (
200
+ <Box flexDirection="column">
201
+ <Text color={colors.tool}>☕︎ read_file</Text>
202
+
203
+ <Box>
204
+ <Text color={colors.secondary}>Path: </Text>
205
+ <Text color={colors.white}>
206
+ {path}{' '}
207
+ {fileInfo.isMetadataOnly && (
208
+ <Text color={colors.info}>(metadata only)</Text>
209
+ )}
210
+ </Text>
211
+ </Box>
212
+
213
+ {fileInfo.isMetadataOnly ? (
214
+ <>
215
+ <Box>
216
+ <Text color={colors.secondary}>Total lines: </Text>
217
+ <Text color={colors.white}>
218
+ {fileInfo.totalLines.toLocaleString()}
219
+ </Text>
220
+ </Box>
221
+ </>
222
+ ) : (
223
+ <>
224
+ <Box>
225
+ <Text color={colors.secondary}>Lines: </Text>
226
+ <Text color={colors.white}>
227
+ {args.start_line || 1} - {args.end_line || fileInfo.totalLines}
228
+ </Text>
229
+ </Box>
230
+
231
+ <Box>
232
+ <Text color={colors.secondary}>Tokens: </Text>
233
+ <Text color={colors.white}>
234
+ ~{fileInfo.tokens.toLocaleString()}
235
+ </Text>
236
+ </Box>
237
+ </>
238
+ )}
239
+ </Box>
240
+ );
241
+
242
+ return <ToolMessage message={messageContent} hideBox={true} />;
243
+ },
244
+ );
245
+
246
+ const readFileFormatter = async (
247
+ args: {
248
+ path?: string;
249
+ file_path?: string;
250
+ start_line?: number;
251
+ end_line?: number;
252
+ },
253
+ result?: string,
254
+ ): Promise<React.ReactElement> => {
255
+ // If result is an error message, don't try to read the file
256
+ if (result && result.startsWith('Error:')) {
257
+ return <></>;
258
+ }
259
+
260
+ // Load file info to calculate actual read information
261
+ let fileInfo = {
262
+ totalLines: 0,
263
+ readLines: 0,
264
+ tokens: 0,
265
+ isPartialRead: false,
266
+ isMetadataOnly: false,
267
+ };
268
+
269
+ try {
270
+ const path = args.path || args.file_path;
271
+ if (path && typeof path === 'string') {
272
+ const absPath = resolve(path);
273
+ const cached = await getCachedFileContent(absPath);
274
+ const content = cached.content;
275
+ const lines = cached.lines;
276
+ const totalLines = lines.length;
277
+
278
+ // Detect if this was a metadata-only response
279
+ const isMetadataOnly =
280
+ (result?.startsWith('File:') ?? false) &&
281
+ !args.start_line &&
282
+ !args.end_line &&
283
+ totalLines > FILE_READ_METADATA_THRESHOLD_LINES;
284
+
285
+ // Calculate what was actually read
286
+ const startLine = args.start_line || 1;
287
+ const endLine = args.end_line || totalLines;
288
+ const readLines = endLine - startLine + 1;
289
+ const isPartialRead = startLine > 1 || endLine < totalLines;
290
+
291
+ // Calculate tokens
292
+ let tokens: number;
293
+ if (isMetadataOnly) {
294
+ // For metadata, show estimated tokens of the FULL FILE
295
+ tokens = Math.ceil(content.length / CHARS_PER_TOKEN_ESTIMATE);
296
+ } else {
297
+ // For content reads, show tokens of what was actually returned
298
+ tokens = result
299
+ ? Math.ceil(result.length / CHARS_PER_TOKEN_ESTIMATE)
300
+ : 0;
301
+ }
302
+
303
+ fileInfo = {
304
+ totalLines,
305
+ readLines,
306
+ tokens,
307
+ isPartialRead,
308
+ isMetadataOnly,
309
+ };
310
+ }
311
+ } catch {
312
+ // File doesn't exist or can't be read - keep default fileInfo
313
+ }
314
+
315
+ return <ReadFileFormatter args={args} fileInfo={fileInfo} />;
316
+ };
317
+
318
+ const readFileValidator = async (args: {
319
+ path: string;
320
+ start_line?: number;
321
+ end_line?: number;
322
+ }): Promise<{ valid: true } | { valid: false; error: string }> => {
323
+ const absPath = resolve(args.path);
324
+
325
+ try {
326
+ await access(absPath, constants.F_OK);
327
+
328
+ // Validate line range parameters
329
+ if (args.start_line !== undefined && args.start_line < 1) {
330
+ return {
331
+ valid: false,
332
+ error: '☕︎ start_line must be >= 1',
333
+ };
334
+ }
335
+
336
+ if (
337
+ args.start_line !== undefined &&
338
+ args.end_line !== undefined &&
339
+ args.end_line < args.start_line
340
+ ) {
341
+ return {
342
+ valid: false,
343
+ error: '☕︎ end_line must be >= start_line',
344
+ };
345
+ }
346
+
347
+ // Check if end_line exceeds file length
348
+ if (args.end_line !== undefined) {
349
+ const cached = await getCachedFileContent(absPath);
350
+ const totalLines = cached.lines.length;
351
+
352
+ if (args.end_line > totalLines) {
353
+ return {
354
+ valid: false,
355
+ error: `☕︎ end_line (${args.end_line}) exceeds file length (${totalLines} lines)`,
356
+ };
357
+ }
358
+ }
359
+
360
+ return { valid: true };
361
+ } catch (error: unknown) {
362
+ if (
363
+ error &&
364
+ typeof error === 'object' &&
365
+ 'code' in error &&
366
+ error.code === 'ENOENT'
367
+ ) {
368
+ return {
369
+ valid: false,
370
+ error: `☕︎ File "${args.path}" does not exist`,
371
+ };
372
+ }
373
+ const errorMessage =
374
+ error instanceof Error ? error.message : 'Unknown error';
375
+ return {
376
+ valid: false,
377
+ error: `☕︎ Cannot access file "${args.path}": ${errorMessage}`,
378
+ };
379
+ }
380
+ };
381
+
382
+ export const readFileTool: CoderToolExport = {
383
+ name: 'read_file' as const,
384
+ tool: readFileCoreTool,
385
+ formatter: readFileFormatter,
386
+ validator: readFileValidator,
387
+ };