@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 type {
2
+ AISDKCoreTool,
3
+ ToolEntry,
4
+ ToolFormatter,
5
+ ToolHandler,
6
+ ToolValidator,
7
+ } from '@/types/index';
8
+
9
+ /**
10
+ * Helper class to encapsulate tool registry management
11
+ *
12
+ * This class provides structured access to tool metadata and eliminates
13
+ * the need to manage multiple separate registries manually.
14
+ *
15
+ * Benefits:
16
+ * - Single source of truth for all tool metadata
17
+ * - Type-safe access to tool components
18
+ * - Cleaner API for tool registration and lookup
19
+ * - Easier to extend with future metadata
20
+ */
21
+ export class ToolRegistry {
22
+ private tools: Map<string, ToolEntry> = new Map();
23
+
24
+ /**
25
+ * Register a complete tool entry
26
+ * @param entry - The ToolEntry containing all tool metadata
27
+ */
28
+ register(entry: ToolEntry): void {
29
+ this.tools.set(entry.name, entry);
30
+ }
31
+
32
+ /**
33
+ * Register multiple tool entries at once
34
+ * @param entries - Array of ToolEntry objects
35
+ */
36
+ registerMany(entries: ToolEntry[]): void {
37
+ for (const entry of entries) {
38
+ this.register(entry);
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Unregister a tool by name
44
+ * @param name - The tool name
45
+ */
46
+ unregister(name: string): void {
47
+ this.tools.delete(name);
48
+ }
49
+
50
+ /**
51
+ * Unregister multiple tools by name
52
+ * @param names - Array of tool names
53
+ */
54
+ unregisterMany(names: string[]): void {
55
+ for (const name of names) {
56
+ this.unregister(name);
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Get a complete tool entry by name
62
+ * @param name - The tool name
63
+ * @returns The ToolEntry or undefined if not found
64
+ */
65
+ getEntry(name: string): ToolEntry | undefined {
66
+ return this.tools.get(name);
67
+ }
68
+
69
+ /**
70
+ * Get a tool handler by name
71
+ * @param name - The tool name
72
+ * @returns The ToolHandler or undefined if not found
73
+ */
74
+ getHandler(name: string): ToolHandler | undefined {
75
+ return this.tools.get(name)?.handler;
76
+ }
77
+
78
+ /**
79
+ * Get a tool formatter by name
80
+ * @param name - The tool name
81
+ * @returns The ToolFormatter or undefined if not found
82
+ */
83
+ getFormatter(name: string): ToolFormatter | undefined {
84
+ return this.tools.get(name)?.formatter;
85
+ }
86
+
87
+ /**
88
+ * Get a tool validator by name
89
+ * @param name - The tool name
90
+ * @returns The ToolValidator or undefined if not found
91
+ */
92
+ getValidator(name: string): ToolValidator | undefined {
93
+ return this.tools.get(name)?.validator;
94
+ }
95
+
96
+ /**
97
+ * Get the native AI SDK tool by name
98
+ * @param name - The tool name
99
+ * @returns The AISDKCoreTool or undefined if not found
100
+ */
101
+ getTool(name: string): AISDKCoreTool | undefined {
102
+ return this.tools.get(name)?.tool;
103
+ }
104
+
105
+ /**
106
+ * Get all handler entries as a record (compatible with old API)
107
+ * @returns Record mapping tool names to handlers
108
+ */
109
+ getHandlers(): Record<string, ToolHandler> {
110
+ const handlers: Record<string, ToolHandler> = {};
111
+ for (const [name, entry] of this.tools) {
112
+ handlers[name] = entry.handler;
113
+ }
114
+ return handlers;
115
+ }
116
+
117
+ /**
118
+ * Get all formatter entries as a record (compatible with old API)
119
+ * @returns Record mapping tool names to formatters
120
+ */
121
+ getFormatters(): Record<string, ToolFormatter> {
122
+ const formatters: Record<string, ToolFormatter> = {};
123
+ for (const [name, entry] of this.tools) {
124
+ if (entry.formatter) {
125
+ formatters[name] = entry.formatter;
126
+ }
127
+ }
128
+ return formatters;
129
+ }
130
+
131
+ /**
132
+ * Get all validator entries as a record (compatible with old API)
133
+ * @returns Record mapping tool names to validators
134
+ */
135
+ getValidators(): Record<string, ToolValidator> {
136
+ const validators: Record<string, ToolValidator> = {};
137
+ for (const [name, entry] of this.tools) {
138
+ if (entry.validator) {
139
+ validators[name] = entry.validator;
140
+ }
141
+ }
142
+ return validators;
143
+ }
144
+
145
+ /**
146
+ * Get all native AI SDK tools as a record (compatible with old API)
147
+ * @returns Record mapping tool names to AISDKCoreTool objects
148
+ */
149
+ getNativeTools(): Record<string, AISDKCoreTool> {
150
+ const nativeTools: Record<string, AISDKCoreTool> = {};
151
+ for (const [name, entry] of this.tools) {
152
+ nativeTools[name] = entry.tool;
153
+ }
154
+ return nativeTools;
155
+ }
156
+
157
+ /**
158
+ * Get all tool entries
159
+ * @returns Array of all ToolEntry objects
160
+ */
161
+ getAllEntries(): ToolEntry[] {
162
+ return Array.from(this.tools.values());
163
+ }
164
+
165
+ /**
166
+ * Get all tool names
167
+ * @returns Array of all registered tool names
168
+ */
169
+ getToolNames(): string[] {
170
+ return Array.from(this.tools.keys());
171
+ }
172
+
173
+ /**
174
+ * Check if a tool is registered
175
+ * @param name - The tool name
176
+ * @returns True if the tool exists, false otherwise
177
+ */
178
+ hasTool(name: string): boolean {
179
+ return this.tools.has(name);
180
+ }
181
+
182
+ /**
183
+ * Get the number of registered tools
184
+ * @returns The count of registered tools
185
+ */
186
+ getToolCount(): number {
187
+ return this.tools.size;
188
+ }
189
+
190
+ /**
191
+ * Clear all registered tools
192
+ */
193
+ clear(): void {
194
+ this.tools.clear();
195
+ }
196
+
197
+ /**
198
+ * Create a new registry from static registries (backward compatibility helper)
199
+ * @param handlers - Record of tool handlers
200
+ * @param tools - Record of native AI SDK tools
201
+ * @param formatters - Optional record of tool formatters
202
+ * @param validators - Optional record of tool validators
203
+ * @returns New ToolRegistry instance
204
+ */
205
+ static fromRegistries(
206
+ handlers: Record<string, ToolHandler>,
207
+ tools: Record<string, AISDKCoreTool>,
208
+ formatters?: Record<string, ToolFormatter>,
209
+ validators?: Record<string, ToolValidator>,
210
+ ): ToolRegistry {
211
+ const registry = new ToolRegistry();
212
+
213
+ for (const [name, handler] of Object.entries(handlers)) {
214
+ const tool = tools[name];
215
+ if (tool) {
216
+ registry.register({
217
+ name,
218
+ handler,
219
+ tool,
220
+ formatter: formatters?.[name],
221
+ validator: validators?.[name],
222
+ });
223
+ }
224
+ }
225
+
226
+ return registry;
227
+ }
228
+ }
@@ -0,0 +1,223 @@
1
+ import * as cheerio from 'cheerio';
2
+ import { Box, Text } from 'ink';
3
+ import React from 'react';
4
+ import { fetch } from 'undici';
5
+
6
+ import ToolMessage from '@/components/tool-message';
7
+ import {
8
+ DEFAULT_WEB_SEARCH_RESULTS,
9
+ MAX_WEB_SEARCH_QUERY_LENGTH,
10
+ TIMEOUT_WEB_SEARCH_MS,
11
+ WEB_SEARCH_DISPLAY_RESULTS,
12
+ } from '@/constants';
13
+ import { ThemeContext } from '@/hooks/useTheme';
14
+ import { jsonSchema, tool } from '@/types/core';
15
+ import type { CoderToolExport } from '@/types/core';
16
+
17
+ interface SearchArgs {
18
+ query: string;
19
+ max_results?: number;
20
+ }
21
+
22
+ interface SearchResult {
23
+ title: string;
24
+ url: string;
25
+ snippet: string;
26
+ }
27
+
28
+ const executeWebSearch = async (args: SearchArgs): Promise<string> => {
29
+ const maxResults = args.max_results ?? DEFAULT_WEB_SEARCH_RESULTS;
30
+ const encodedQuery = encodeURIComponent(args.query);
31
+
32
+ try {
33
+ // Use Brave Search - scraper-friendly, no CAPTCHA
34
+ const searchUrl = `https://search.brave.com/search?q=${encodedQuery}`;
35
+
36
+ const response = await fetch(searchUrl, {
37
+ headers: {
38
+ 'User-Agent':
39
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
40
+ Accept: 'text/html',
41
+ },
42
+ signal: AbortSignal.timeout(TIMEOUT_WEB_SEARCH_MS),
43
+ });
44
+
45
+ if (!response.ok) {
46
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
47
+ }
48
+
49
+ const html = await response.text();
50
+ const $ = cheerio.load(html);
51
+
52
+ const results: SearchResult[] = [];
53
+
54
+ // Brave Search uses specific result containers
55
+ $('[data-type="web"]').each((_i, elem) => {
56
+ if (results.length >= maxResults) return;
57
+
58
+ const $elem = $(elem);
59
+
60
+ // Extract title and URL
61
+ const titleLink = $elem.find('a[href^="http"]').first();
62
+ const url = titleLink.attr('href');
63
+ const title = titleLink.text().trim();
64
+
65
+ // Extract snippet
66
+ const snippet = $elem.find('.snippet-description').text().trim();
67
+
68
+ if (url && title) {
69
+ results.push({
70
+ title: title || 'No title',
71
+ url,
72
+ snippet: snippet || '',
73
+ });
74
+ }
75
+ });
76
+
77
+ if (results.length === 0) {
78
+ return `No results found for query: "${args.query}"`;
79
+ }
80
+
81
+ // Format results as markdown for easier LLM reading
82
+ let formattedResults = `# Web Search Results: "${args.query}"\n\n`;
83
+
84
+ for (let i = 0; i < results.length; i++) {
85
+ const result = results[i];
86
+ formattedResults += `## ${i + 1}. ${result.title}\n\n`;
87
+ formattedResults += `**URL:** ${result.url}\n\n`;
88
+ if (result.snippet) {
89
+ formattedResults += `${result.snippet}\n\n`;
90
+ }
91
+ formattedResults += '---\n\n';
92
+ }
93
+
94
+ return formattedResults;
95
+ } catch (error: unknown) {
96
+ if (error instanceof Error && error.name === 'AbortError') {
97
+ throw new Error('Search request timeout');
98
+ }
99
+
100
+ const errorMessage =
101
+ error instanceof Error ? error.message : 'Unknown error';
102
+ throw new Error(`Web search failed: ${errorMessage}`);
103
+ }
104
+ };
105
+
106
+ const webSearchCoreTool = tool({
107
+ description:
108
+ 'Search the web for information (scrapes Brave Search, returns markdown)',
109
+ inputSchema: jsonSchema<SearchArgs>({
110
+ type: 'object',
111
+ properties: {
112
+ query: {
113
+ type: 'string',
114
+ description: 'The search query.',
115
+ },
116
+ max_results: {
117
+ type: 'number',
118
+ description:
119
+ 'Maximum number of search results to return (default: 10).',
120
+ },
121
+ },
122
+ required: ['query'],
123
+ }),
124
+ // Low risk: read-only operation, never requires approval
125
+ needsApproval: false,
126
+ execute: async (args, _options) => {
127
+ return await executeWebSearch(args);
128
+ },
129
+ });
130
+
131
+ // Create a component that will re-render when theme changes
132
+ const WebSearchFormatter = React.memo(
133
+ ({ args, result }: { args: SearchArgs; result?: string }) => {
134
+ const themeContext = React.useContext(ThemeContext);
135
+ if (!themeContext) {
136
+ throw new Error('ThemeContext not found');
137
+ }
138
+ const { colors } = themeContext;
139
+ const query = args.query || 'unknown';
140
+ const maxResults = args.max_results ?? WEB_SEARCH_DISPLAY_RESULTS;
141
+
142
+ // Parse result to count actual results
143
+ let resultCount = 0;
144
+ let estimatedTokens = 0;
145
+ if (result) {
146
+ const matches = result.match(/^## \d+\./gm);
147
+ resultCount = matches ? matches.length : 0;
148
+ estimatedTokens = Math.ceil(result.length / 4);
149
+ }
150
+
151
+ const messageContent = (
152
+ <Box flexDirection="column">
153
+ <Text color={colors.tool}>☕︎ web_search</Text>
154
+
155
+ <Box>
156
+ <Text color={colors.secondary}>Query: </Text>
157
+ <Text color={colors.white}>{query}</Text>
158
+ </Box>
159
+
160
+ <Box>
161
+ <Text color={colors.secondary}>Engine: </Text>
162
+ <Text color={colors.white}>Brave Search</Text>
163
+ </Box>
164
+
165
+ {result && (
166
+ <>
167
+ <Box>
168
+ <Text color={colors.secondary}>Results: </Text>
169
+ <Text color={colors.white}>
170
+ {resultCount} / {maxResults} results
171
+ </Text>
172
+ </Box>
173
+
174
+ <Box>
175
+ <Text color={colors.secondary}>Output: </Text>
176
+ <Text color={colors.white}>~{estimatedTokens} tokens</Text>
177
+ </Box>
178
+ </>
179
+ )}
180
+ </Box>
181
+ );
182
+
183
+ return <ToolMessage message={messageContent} hideBox={true} />;
184
+ },
185
+ );
186
+
187
+ const webSearchFormatter = (
188
+ args: SearchArgs,
189
+ result?: string,
190
+ ): React.ReactElement => {
191
+ return <WebSearchFormatter args={args} result={result} />;
192
+ };
193
+
194
+ const webSearchValidator = (
195
+ args: SearchArgs,
196
+ ): Promise<{ valid: true } | { valid: false; error: string }> => {
197
+ const query = args.query?.trim();
198
+
199
+ // Check if query is empty
200
+ if (!query) {
201
+ return Promise.resolve({
202
+ valid: false,
203
+ error: '☕︎ Search query cannot be empty',
204
+ });
205
+ }
206
+
207
+ // Check query length (reasonable limit)
208
+ if (query.length > MAX_WEB_SEARCH_QUERY_LENGTH) {
209
+ return Promise.resolve({
210
+ valid: false,
211
+ error: `☕︎ Search query is too long (${query.length} characters). Maximum length is ${MAX_WEB_SEARCH_QUERY_LENGTH} characters.`,
212
+ });
213
+ }
214
+
215
+ return Promise.resolve({ valid: true });
216
+ };
217
+
218
+ export const webSearchTool: CoderToolExport = {
219
+ name: 'web_search' as const,
220
+ tool: webSearchCoreTool,
221
+ formatter: webSearchFormatter,
222
+ validator: webSearchValidator,
223
+ };