@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,293 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import ignore from 'ignore';
6
+ import { Box, Text } from 'ink';
7
+ import React from 'react';
8
+
9
+ import ToolMessage from '@/components/tool-message';
10
+ import {
11
+ BUFFER_FIND_FILES_BYTES,
12
+ DEFAULT_FIND_FILES_RESULTS,
13
+ MAX_FIND_FILES_RESULTS,
14
+ } from '@/constants';
15
+ import { ThemeContext } from '@/hooks/useTheme';
16
+ import { jsonSchema, tool } from '@/types/core';
17
+
18
+ const execFileAsync = promisify(execFile);
19
+
20
+ /**
21
+ * Load and parse .gitignore file, returns an ignore instance
22
+ */
23
+ function loadGitignore(cwd: string): ReturnType<typeof ignore> {
24
+ const ig = ignore();
25
+ const gitignorePath = join(cwd, '.gitignore');
26
+
27
+ // Always ignore common directories
28
+ ig.add([
29
+ 'node_modules',
30
+ '.git',
31
+ 'dist',
32
+ 'build',
33
+ 'coverage',
34
+ '.next',
35
+ '.nuxt',
36
+ 'out',
37
+ '.cache',
38
+ ]);
39
+
40
+ // Load .gitignore if it exists
41
+ if (existsSync(gitignorePath)) {
42
+ try {
43
+ const gitignoreContent = readFileSync(gitignorePath, 'utf-8');
44
+ ig.add(gitignoreContent);
45
+ } catch {
46
+ // Silently fail if we can't read .gitignore
47
+ // The hardcoded ignores above will still apply
48
+ }
49
+ }
50
+
51
+ return ig;
52
+ }
53
+
54
+ /**
55
+ * Find files matching a glob pattern using find command
56
+ */
57
+ async function findFilesByPattern(
58
+ pattern: string,
59
+ cwd: string,
60
+ maxResults: number,
61
+ ): Promise<{ files: string[]; truncated: boolean }> {
62
+ try {
63
+ const ig = loadGitignore(cwd);
64
+
65
+ // Build find arguments array to prevent command injection
66
+ const findArgs: string[] = ['.'];
67
+
68
+ if (pattern.includes('{') && pattern.includes('}')) {
69
+ // Handle brace expansion like *.{ts,tsx}
70
+ const braceMatch = pattern.match(/\{([^}]+)\}/);
71
+ if (braceMatch) {
72
+ const extensions = braceMatch[1].split(',');
73
+ // Build: ( -name "*.ext1" -o -name "*.ext2" )
74
+ findArgs.push('(');
75
+ for (let i = 0; i < extensions.length; i++) {
76
+ if (i > 0) {
77
+ findArgs.push('-o');
78
+ }
79
+ findArgs.push('-name', `*.${extensions[i].trim()}`);
80
+ }
81
+ findArgs.push(')');
82
+ }
83
+ } else if (pattern.startsWith('**/')) {
84
+ // Pattern like **/*.ts - search everywhere
85
+ const namePattern = pattern.replace('**/', '');
86
+ findArgs.push('-name', namePattern);
87
+ } else if (pattern.includes('/**')) {
88
+ // Pattern like scripts/** or scripts/**/*.ts - search within a directory
89
+ const parts = pattern.split('/**');
90
+ const pathPrefix = `./${parts[0]}`;
91
+ const namePattern = parts[1] ? parts[1].replace(/^\//, '') : '*';
92
+
93
+ // Replace the starting '.' with pathPrefix
94
+ findArgs[0] = pathPrefix;
95
+
96
+ if (namePattern !== '*' && namePattern !== '') {
97
+ findArgs.push('-name', namePattern);
98
+ }
99
+ } else if (pattern.includes('/') && pattern.includes('*')) {
100
+ // Pattern like source/tools/*.ts - has both path and wildcard
101
+ // Split into directory path and filename pattern
102
+ const lastSlashIndex = pattern.lastIndexOf('/');
103
+ const dirPath = pattern.substring(0, lastSlashIndex);
104
+ const filePattern = pattern.substring(lastSlashIndex + 1);
105
+
106
+ // Start search from the directory
107
+ findArgs[0] = `./${dirPath}`;
108
+ // Only descend one level (maxdepth 1) to match the specific directory
109
+ findArgs.push('-maxdepth', '1', '-name', filePattern);
110
+ } else if (pattern.includes('*')) {
111
+ // Simple pattern like *.ts
112
+ findArgs.push('-name', pattern);
113
+ } else {
114
+ // Exact path or directory name
115
+ findArgs.push('-name', pattern);
116
+ }
117
+
118
+ // Add exclusions
119
+ const exclusions = [
120
+ '*/node_modules/*',
121
+ '*/.git/*',
122
+ '*/dist/*',
123
+ '*/build/*',
124
+ '*/coverage/*',
125
+ '*/.next/*',
126
+ '*/.nuxt/*',
127
+ '*/out/*',
128
+ '*/.cache/*',
129
+ ];
130
+
131
+ for (const exclusion of exclusions) {
132
+ findArgs.push('-not', '-path', exclusion);
133
+ }
134
+
135
+ // Execute find command with array-based arguments
136
+ const { stdout } = await execFileAsync('find', findArgs, {
137
+ cwd,
138
+ maxBuffer: BUFFER_FIND_FILES_BYTES,
139
+ });
140
+
141
+ const allPaths = stdout
142
+ .trim()
143
+ .split('\n')
144
+ .filter(Boolean)
145
+ .map(line => line.replace(/^\.\//, ''))
146
+ .filter(path => path && path !== '.');
147
+
148
+ // Filter using gitignore and limit results
149
+ const paths: string[] = [];
150
+ for (const path of allPaths) {
151
+ if (!ig.ignores(path)) {
152
+ paths.push(path);
153
+
154
+ if (paths.length >= maxResults) {
155
+ break;
156
+ }
157
+ }
158
+ }
159
+
160
+ return {
161
+ files: paths,
162
+ truncated: allPaths.length >= maxResults || paths.length >= maxResults,
163
+ };
164
+ } catch (error: unknown) {
165
+ if (error instanceof Error && 'code' in error && error.code === 1) {
166
+ return { files: [], truncated: false };
167
+ }
168
+ throw error;
169
+ }
170
+ }
171
+
172
+ interface FindFilesArgs {
173
+ pattern: string;
174
+ maxResults?: number;
175
+ }
176
+
177
+ const executeFindFiles = async (args: FindFilesArgs): Promise<string> => {
178
+ const cwd = process.cwd();
179
+ const maxResults = Math.min(
180
+ args.maxResults || DEFAULT_FIND_FILES_RESULTS,
181
+ MAX_FIND_FILES_RESULTS,
182
+ );
183
+
184
+ try {
185
+ const { files, truncated } = await findFilesByPattern(
186
+ args.pattern,
187
+ cwd,
188
+ maxResults,
189
+ );
190
+
191
+ if (files.length === 0) {
192
+ return `No files or directories found matching pattern "${args.pattern}"`;
193
+ }
194
+
195
+ let output = `Found ${files.length} match${files.length === 1 ? '' : 'es'}${truncated ? ` (showing first ${maxResults})` : ''
196
+ }:\n\n`;
197
+ output += files.join('\n');
198
+
199
+ return output;
200
+ } catch (error: unknown) {
201
+ const errorMessage =
202
+ error instanceof Error ? error.message : 'Unknown error';
203
+ throw new Error(`File search failed: ${errorMessage}`);
204
+ }
205
+ };
206
+
207
+ const findFilesCoreTool = tool({
208
+ description:
209
+ 'Find files and directories by path pattern or name. Use glob patterns like "*.tsx", "**/*.ts", "src/**/*.js", or "*.{ts,tsx}". Returns a list of matching file and directory paths. Does NOT search file contents - use search_file_contents for that.',
210
+ inputSchema: jsonSchema<FindFilesArgs>({
211
+ type: 'object',
212
+ properties: {
213
+ pattern: {
214
+ type: 'string',
215
+ description:
216
+ 'Glob pattern to match file and directory paths. Examples: "*.tsx" (all .tsx files), "src/**/*.ts" (all .ts in src/), "components/**" (all files/dirs in components/), "*.{ts,tsx}" (multiple extensions)',
217
+ },
218
+ maxResults: {
219
+ type: 'number',
220
+ description:
221
+ 'Maximum number of results to return (default: 50, max: 100)',
222
+ },
223
+ },
224
+ required: ['pattern'],
225
+ }),
226
+ // Low risk: read-only operation, never requires approval
227
+ needsApproval: false,
228
+ execute: async (args, _options) => {
229
+ return await executeFindFiles(args);
230
+ },
231
+ });
232
+
233
+ interface FindFilesFormatterProps {
234
+ args: {
235
+ pattern: string;
236
+ maxResults?: number;
237
+ };
238
+ result?: string;
239
+ }
240
+
241
+ const FindFilesFormatter = React.memo(
242
+ ({ args, result }: FindFilesFormatterProps) => {
243
+ const themeContext = React.useContext(ThemeContext);
244
+ if (!themeContext) {
245
+ throw new Error('ThemeContext not found');
246
+ }
247
+ const { colors } = themeContext;
248
+
249
+ // Parse result to get file count
250
+ let fileCount = 0;
251
+ if (result && !result.startsWith('Error:')) {
252
+ const firstLine = result.split('\n')[0];
253
+ const matchFound = firstLine.match(/Found (\d+)/);
254
+ if (matchFound) {
255
+ fileCount = parseInt(matchFound[1], 10);
256
+ }
257
+ }
258
+
259
+ const messageContent = (
260
+ <Box flexDirection="column">
261
+ <Text color={colors.tool}>☕︎ find_files</Text>
262
+
263
+ <Box>
264
+ <Text color={colors.secondary}>Pattern: </Text>
265
+ <Text color={colors.white}>{args.pattern}</Text>
266
+ </Box>
267
+
268
+ <Box>
269
+ <Text color={colors.secondary}>Results: </Text>
270
+ <Text color={colors.white}>{fileCount}</Text>
271
+ </Box>
272
+ </Box>
273
+ );
274
+
275
+ return <ToolMessage message={messageContent} hideBox={true} />;
276
+ },
277
+ );
278
+
279
+ const findFilesFormatter = (
280
+ args: FindFilesFormatterProps['args'],
281
+ result?: string,
282
+ ): React.ReactElement => {
283
+ if (result && result.startsWith('Error:')) {
284
+ return <></>;
285
+ }
286
+ return <FindFilesFormatter args={args} result={result} />;
287
+ };
288
+
289
+ export const findFilesTool = {
290
+ name: 'find_files' as const,
291
+ tool: findFilesCoreTool,
292
+ formatter: findFilesFormatter,
293
+ };
@@ -0,0 +1,102 @@
1
+ import {executeBashTool} from '@/tools/execute-bash';
2
+ import {fetchUrlTool} from '@/tools/fetch-url';
3
+ import {findFilesTool} from '@/tools/find-files';
4
+ import {getDiagnosticsTool} from '@/tools/lsp-get-diagnostics';
5
+ import {readFileTool} from '@/tools/read-file';
6
+ import {searchFileContentsTool} from '@/tools/search-file-contents';
7
+ import {stringReplaceTool} from '@/tools/string-replace';
8
+ import {webSearchTool} from '@/tools/web-search';
9
+ import {writeFileTool} from '@/tools/write-file';
10
+ import type {
11
+ AISDKCoreTool,
12
+ CoderToolExport,
13
+ ToolHandler,
14
+ } from '@/types/index';
15
+ import React from 'react';
16
+
17
+ // Array of all tool exports from individual tool files
18
+ // Each tool exports: { name, tool, formatter?, validator? }
19
+ const allTools: CoderToolExport[] = [
20
+ readFileTool,
21
+ writeFileTool,
22
+ stringReplaceTool,
23
+ executeBashTool,
24
+ webSearchTool,
25
+ fetchUrlTool,
26
+ findFilesTool,
27
+ searchFileContentsTool,
28
+ getDiagnosticsTool,
29
+ ];
30
+
31
+ // Export native AI SDK tools registry (for passing directly to AI SDK)
32
+ export const nativeToolsRegistry: Record<string, AISDKCoreTool> =
33
+ Object.fromEntries(allTools.map(t => [t.name, t.tool]));
34
+
35
+ // Export handlers for manual execution (human-in-the-loop)
36
+ // These are extracted from the AI SDK tools' execute functions
37
+ export const toolRegistry: Record<string, ToolHandler> = Object.fromEntries(
38
+ allTools.map(t => [
39
+ t.name,
40
+ // Extract the execute function from the AI SDK tool
41
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
42
+ async (args: any) => {
43
+ // Call the tool's execute function with a dummy options object
44
+ // The actual options will be provided by AI SDK during automatic execution
45
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
46
+ return await (t.tool as any).execute(args, {
47
+ toolCallId: 'manual',
48
+ messages: [],
49
+ });
50
+ },
51
+ ]),
52
+ );
53
+
54
+ // Export formatter registry for the UI
55
+ export const toolFormatters: Record<
56
+ string,
57
+ (
58
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
59
+ args: any,
60
+ ) =>
61
+ | string
62
+ | Promise<string>
63
+ | React.ReactElement
64
+ | Promise<React.ReactElement>
65
+ > = allTools.reduce(
66
+ (acc, t) => {
67
+ if ('formatter' in t && t.formatter) {
68
+ acc[t.name] = t.formatter;
69
+ }
70
+ return acc;
71
+ },
72
+ {} as Record<
73
+ string,
74
+ (
75
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
76
+ args: any,
77
+ ) =>
78
+ | string
79
+ | Promise<string>
80
+ | React.ReactElement
81
+ | Promise<React.ReactElement>
82
+ >,
83
+ );
84
+
85
+ // Export validator registry
86
+ export const toolValidators: Record<
87
+ string,
88
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
89
+ (args: any) => Promise<{valid: true} | {valid: false; error: string}>
90
+ > = allTools.reduce(
91
+ (acc, t) => {
92
+ if ('validator' in t && t.validator) {
93
+ acc[t.name] = t.validator;
94
+ }
95
+ return acc;
96
+ },
97
+ {} as Record<
98
+ string,
99
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
100
+ (args: any) => Promise<{valid: true} | {valid: false; error: string}>
101
+ >,
102
+ );
@@ -0,0 +1,192 @@
1
+ import { resolve as resolvePath } from 'node:path';
2
+ import { Box, Text } from 'ink';
3
+ import React from 'react';
4
+
5
+ import ToolMessage from '@/components/tool-message';
6
+ import { TIMEOUT_LSP_DIAGNOSTICS_MS } from '@/constants';
7
+ import { ThemeContext } from '@/hooks/useTheme';
8
+ import { DiagnosticSeverity, getLSPManager } from '@/lsp/index';
9
+ import { jsonSchema, tool } from '@/types/core';
10
+
11
+ interface GetDiagnosticsArgs {
12
+ path?: string;
13
+ }
14
+
15
+ // Request diagnostics from VS Code with timeout
16
+
17
+
18
+ // Handler function
19
+ const executeGetDiagnostics = async (
20
+ args: GetDiagnosticsArgs,
21
+ ): Promise<string> => {
22
+
23
+
24
+ // Fall back to local LSP
25
+ const lspManager = getLSPManager();
26
+
27
+ if (!lspManager.isInitialized()) {
28
+ return 'No diagnostics source available. Please install a language server.';
29
+ }
30
+
31
+ // If path is provided, get diagnostics for that file
32
+ if (args.path) {
33
+ // Check if we have LSP support for this file type
34
+ if (!lspManager.hasLanguageSupport(args.path)) {
35
+ return `No language server available for file type: ${args.path}.`;
36
+ }
37
+
38
+ // Open the document if not already open
39
+ await lspManager.openDocument(args.path);
40
+
41
+ // Get diagnostics
42
+ const diagnostics = await lspManager.getDiagnostics(args.path);
43
+
44
+ if (diagnostics.length === 0) {
45
+ return `No diagnostics found for ${args.path}`;
46
+ }
47
+
48
+ // Format diagnostics
49
+ const lines: string[] = [`Diagnostics for ${args.path}:`, ''];
50
+
51
+ for (const diag of diagnostics) {
52
+ const severity =
53
+ diag.severity === DiagnosticSeverity.Error
54
+ ? 'ERROR'
55
+ : diag.severity === DiagnosticSeverity.Warning
56
+ ? 'WARNING'
57
+ : diag.severity === DiagnosticSeverity.Information
58
+ ? 'INFO'
59
+ : 'HINT';
60
+
61
+ const line = diag.range.start.line + 1;
62
+ const char = diag.range.start.character + 1;
63
+ const source = diag.source ? `[${diag.source}] ` : '';
64
+
65
+ lines.push(
66
+ `${severity} at line ${line}:${char}: ${source}${diag.message}`,
67
+ );
68
+ }
69
+
70
+ return lines.join('\n');
71
+ }
72
+
73
+ // Get all diagnostics from all open documents
74
+ const allDiagnostics = lspManager.getAllDiagnostics();
75
+
76
+ if (allDiagnostics.length === 0) {
77
+ return 'No diagnostics found in any open documents.';
78
+ }
79
+
80
+ const lines: string[] = ['Diagnostics from all open documents:', ''];
81
+
82
+ for (const { uri, diagnostics } of allDiagnostics) {
83
+ // Convert URI to path
84
+ const path = uri.startsWith('file://') ? uri.slice(7) : uri;
85
+ lines.push(`\n${path}:`);
86
+
87
+ for (const diag of diagnostics) {
88
+ const severity =
89
+ diag.severity === DiagnosticSeverity.Error
90
+ ? 'ERROR'
91
+ : diag.severity === DiagnosticSeverity.Warning
92
+ ? 'WARNING'
93
+ : diag.severity === DiagnosticSeverity.Information
94
+ ? 'INFO'
95
+ : 'HINT';
96
+
97
+ const line = diag.range.start.line + 1;
98
+ const char = diag.range.start.character + 1;
99
+ const source = diag.source ? `[${diag.source}] ` : '';
100
+
101
+ lines.push(
102
+ ` ${severity} at line ${line}:${char}: ${source}${diag.message}`,
103
+ );
104
+ }
105
+ }
106
+
107
+ return lines.join('\n');
108
+ };
109
+
110
+ const getDiagnosticsCoreTool = tool({
111
+ description:
112
+ 'Get errors and warnings for a file or project from the language server. Returns type errors, linting issues, and other diagnostics. Use this to check for problems before or after making code changes.',
113
+ inputSchema: jsonSchema<GetDiagnosticsArgs>({
114
+ type: 'object',
115
+ properties: {
116
+ path: {
117
+ type: 'string',
118
+ description:
119
+ 'Optional path to a specific file. If omitted, returns diagnostics for all open documents.',
120
+ },
121
+ },
122
+ required: [],
123
+ }),
124
+ // Low risk: read-only operation, never requires approval
125
+ needsApproval: false,
126
+ execute: async (args, _options) => {
127
+ return await executeGetDiagnostics(args);
128
+ },
129
+ });
130
+
131
+ // Formatter component
132
+ const GetDiagnosticsFormatter = React.memo(
133
+ ({ args, result }: { args: GetDiagnosticsArgs; result?: string }) => {
134
+ const themeContext = React.useContext(ThemeContext);
135
+ if (!themeContext) {
136
+ throw new Error(
137
+ 'GetDiagnosticsFormatter must be used within a ThemeProvider',
138
+ );
139
+ }
140
+ const { colors } = themeContext;
141
+
142
+ // Count diagnostics from result
143
+ const errorCount = (result?.match(/ERROR/g) || []).length;
144
+ const warningCount = (result?.match(/WARNING/g) || []).length;
145
+
146
+ const messageContent = (
147
+ <Box flexDirection="column">
148
+ <Text color={colors.tool}>☕︎ get_diagnostics</Text>
149
+
150
+ {args.path ? (
151
+ <Box>
152
+ <Text color={colors.secondary}>Path: </Text>
153
+ <Text color={colors.white}>{args.path}</Text>
154
+ </Box>
155
+ ) : (
156
+ <Box>
157
+ <Text color={colors.secondary}>Scope: </Text>
158
+ <Text color={colors.white}>All open documents</Text>
159
+ </Box>
160
+ )}
161
+
162
+ {result && (
163
+ <Box>
164
+ <Text color={colors.secondary}>Found: </Text>
165
+ <Text color={errorCount > 0 ? colors.error : colors.white}>
166
+ {errorCount} errors
167
+ </Text>
168
+ <Text color={colors.secondary}>, </Text>
169
+ <Text color={warningCount > 0 ? colors.warning : colors.white}>
170
+ {warningCount} warnings
171
+ </Text>
172
+ </Box>
173
+ )}
174
+ </Box>
175
+ );
176
+
177
+ return <ToolMessage message={messageContent} hideBox={true} />;
178
+ },
179
+ );
180
+
181
+ const getDiagnosticsFormatter = (
182
+ args: GetDiagnosticsArgs,
183
+ result?: string,
184
+ ): React.ReactElement => {
185
+ return <GetDiagnosticsFormatter args={args} result={result} />;
186
+ };
187
+
188
+ export const getDiagnosticsTool = {
189
+ name: 'lsp_get_diagnostics' as const,
190
+ tool: getDiagnosticsCoreTool,
191
+ formatter: getDiagnosticsFormatter,
192
+ };