@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,533 @@
1
+ import { commandRegistry } from '@/commands';
2
+ import { DevelopmentModeIndicator } from '@/components/development-mode-indicator';
3
+ import { useInputState } from '@/hooks/useInputState';
4
+ import { useResponsiveTerminal } from '@/hooks/useTerminalWidth';
5
+ import { useTheme } from '@/hooks/useTheme';
6
+ import { useUIStateContext } from '@/hooks/useUIState';
7
+ import { promptHistory } from '@/prompt-history';
8
+ import type { DevelopmentMode } from '@/types/core';
9
+ import { Completion } from '@/types/index';
10
+ import {
11
+ getCurrentFileMention,
12
+ getFileCompletions,
13
+ } from '@/utils/file-autocomplete';
14
+ import { handleFileMention } from '@/utils/file-mention-handler';
15
+ import { assemblePrompt } from '@/utils/prompt-processor';
16
+ import { Box, Text, useFocus, useInput } from 'ink';
17
+ import RandomSpinner from '@/components/random-spinner';
18
+ import TextInput from 'ink-text-input';
19
+ import { useCallback, useEffect, useMemo, useState } from 'react';
20
+
21
+ interface ChatProps {
22
+ onSubmit?: (message: string) => void;
23
+ placeholder?: string;
24
+ customCommands?: string[]; // List of custom command names and aliases
25
+ disabled?: boolean; // Disable input when AI is processing
26
+ onCancel?: () => void; // Callback when user presses escape while thinking
27
+ onToggleMode?: () => void; // Callback when user presses shift+tab to toggle development mode
28
+ developmentMode?: DevelopmentMode; // Current development mode
29
+ }
30
+
31
+ export default function UserInput({
32
+ onSubmit,
33
+ placeholder,
34
+ customCommands = [],
35
+ disabled = false,
36
+ onCancel,
37
+ onToggleMode,
38
+ developmentMode = 'normal',
39
+ }: ChatProps) {
40
+ const { isFocused, focus } = useFocus({ autoFocus: !disabled, id: 'user-input' });
41
+ const { colors } = useTheme();
42
+ const inputState = useInputState();
43
+ const uiState = useUIStateContext();
44
+ const { boxWidth, isNarrow } = useResponsiveTerminal();
45
+ const [textInputKey, setTextInputKey] = useState(0);
46
+ // Store the original InputState (including placeholders) when starting history navigation
47
+ const [originalInputState, setOriginalInputState] = useState<
48
+ typeof inputState.currentState | null
49
+ >(null);
50
+
51
+ // File autocomplete state
52
+ const [isFileAutocompleteMode, setIsFileAutocompleteMode] = useState(false);
53
+ const [fileCompletions, setFileCompletions] = useState<
54
+ Array<{ path: string; score: number }>
55
+ >([]);
56
+ const [selectedFileIndex, setSelectedFileIndex] = useState(0);
57
+
58
+ // Responsive placeholder text
59
+ const defaultPlaceholder = isNarrow
60
+ ? '/ for commands, ! for bash, ↑/↓ history'
61
+ : 'Type `/` and then press Tab for command suggestions or `!` to execute bash commands. Use ↑/↓ for history.';
62
+ const actualPlaceholder = placeholder ?? defaultPlaceholder;
63
+
64
+ const {
65
+ input,
66
+ originalInput,
67
+ historyIndex,
68
+ setOriginalInput,
69
+ setHistoryIndex,
70
+ updateInput,
71
+ resetInput,
72
+ // New paste handling functions
73
+ undo,
74
+ redo,
75
+ deletePlaceholder: _deletePlaceholder,
76
+ currentState,
77
+ setInputState,
78
+ } = inputState;
79
+
80
+ const {
81
+ showClearMessage,
82
+ showCompletions,
83
+ completions,
84
+ setShowClearMessage,
85
+ setShowCompletions,
86
+ setCompletions,
87
+ resetUIState,
88
+ } = uiState;
89
+
90
+ // Check if we're in bash mode (input starts with !)
91
+ const isBashMode = input.trim().startsWith('!');
92
+
93
+ // Check if we're in command mode (input starts with /)
94
+ const isCommandMode = input.trim().startsWith('/');
95
+
96
+ // Load history on mount
97
+ useEffect(() => {
98
+ void promptHistory.loadHistory();
99
+ }, []);
100
+
101
+ // Trigger file autocomplete when input changes
102
+ useEffect(() => {
103
+ const runFileAutocomplete = async () => {
104
+ const mention = getCurrentFileMention(input, input.length);
105
+
106
+ if (mention) {
107
+ setIsFileAutocompleteMode(true);
108
+ const cwd = process.cwd();
109
+ const completions = await getFileCompletions(mention.mention, cwd);
110
+ setFileCompletions(completions);
111
+ setSelectedFileIndex(0); // Reset selection when completions change
112
+ } else {
113
+ setIsFileAutocompleteMode(false);
114
+ setFileCompletions([]);
115
+ setSelectedFileIndex(0);
116
+ }
117
+ };
118
+
119
+ void runFileAutocomplete();
120
+ }, [input]);
121
+
122
+ // Calculate command completions using useMemo to prevent flashing
123
+ const commandCompletions = useMemo(() => {
124
+ if (!isCommandMode || isFileAutocompleteMode) {
125
+ return [];
126
+ }
127
+
128
+ const commandPrefix = input.slice(1).split(' ')[0];
129
+ if (commandPrefix.length === 0) {
130
+ return [];
131
+ }
132
+
133
+ const builtInCompletions = commandRegistry.getCompletions(commandPrefix);
134
+ const customCompletions = customCommands
135
+ .filter(cmd => {
136
+ return cmd.toLowerCase().includes(commandPrefix.toLowerCase());
137
+ })
138
+ .sort((a, b) => a.localeCompare(b));
139
+
140
+ return [
141
+ ...builtInCompletions.map(cmd => ({ name: cmd, isCustom: false })),
142
+ ...customCompletions.map(cmd => ({ name: cmd, isCustom: true })),
143
+ ] as Completion[];
144
+ }, [input, isCommandMode, isFileAutocompleteMode, customCommands]);
145
+
146
+ // Update UI state for command completions
147
+ useEffect(() => {
148
+ if (commandCompletions.length > 0) {
149
+ setCompletions(commandCompletions);
150
+ setShowCompletions(true);
151
+ } else if (showCompletions) {
152
+ setCompletions([]);
153
+ setShowCompletions(false);
154
+ }
155
+ }, [commandCompletions, showCompletions, setCompletions, setShowCompletions]);
156
+
157
+ // Helper functions
158
+
159
+ // Handle file mention selection (Tab key in file autocomplete mode)
160
+ const handleFileSelection = useCallback(async () => {
161
+ if (!isFileAutocompleteMode || fileCompletions.length === 0) {
162
+ return false;
163
+ }
164
+
165
+ const mention = getCurrentFileMention(input, input.length);
166
+ if (!mention) {
167
+ return false;
168
+ }
169
+
170
+ // Select the currently highlighted file
171
+ const selectedPath = fileCompletions[selectedFileIndex]?.path;
172
+ if (!selectedPath) {
173
+ return false;
174
+ }
175
+
176
+ // Extract the original mention text (the @... part we're replacing)
177
+ const mentionText = input.substring(mention.startIndex, mention.endIndex);
178
+
179
+ // Handle the file mention to create placeholder
180
+ const result = await handleFileMention(
181
+ selectedPath,
182
+ currentState.displayValue,
183
+ currentState.placeholderContent,
184
+ mentionText,
185
+ );
186
+
187
+ if (result) {
188
+ setInputState(result);
189
+ setIsFileAutocompleteMode(false);
190
+ setFileCompletions([]);
191
+ setSelectedFileIndex(0);
192
+ setTextInputKey(prev => prev + 1);
193
+ return true;
194
+ }
195
+
196
+ return false;
197
+ }, [
198
+ isFileAutocompleteMode,
199
+ fileCompletions,
200
+ selectedFileIndex,
201
+ input,
202
+ currentState,
203
+ setInputState,
204
+ ]);
205
+
206
+ // Handle form submission
207
+ const handleSubmit = useCallback(() => {
208
+ if (input.trim() && onSubmit) {
209
+ // Assemble the full prompt by replacing placeholders with content
210
+ const fullMessage = assemblePrompt(currentState);
211
+
212
+ // Save the InputState to history and send assembled message to AI
213
+ promptHistory.addPrompt(currentState);
214
+ onSubmit(fullMessage);
215
+ resetInput();
216
+ resetUIState();
217
+ promptHistory.resetIndex();
218
+ }
219
+ }, [input, onSubmit, resetInput, resetUIState, currentState]);
220
+
221
+ // Handle escape key logic
222
+ const handleEscape = useCallback(() => {
223
+ if (showClearMessage) {
224
+ resetInput();
225
+ resetUIState();
226
+ focus('user-input');
227
+ } else {
228
+ setShowClearMessage(true);
229
+ }
230
+ }, [showClearMessage, resetInput, resetUIState, setShowClearMessage, focus]);
231
+
232
+ // History navigation
233
+ const handleHistoryNavigation = useCallback(
234
+ (direction: 'up' | 'down') => {
235
+ const history = promptHistory.getHistory();
236
+ if (history.length === 0) return;
237
+
238
+ if (direction === 'up') {
239
+ if (historyIndex === -1) {
240
+ // Save the full current state (including placeholders) before starting navigation
241
+ setOriginalInputState(currentState);
242
+ setOriginalInput(input);
243
+ setHistoryIndex(history.length - 1);
244
+ setInputState(history[history.length - 1]);
245
+ setTextInputKey(prev => prev + 1);
246
+ } else if (historyIndex > 0) {
247
+ const newIndex = historyIndex - 1;
248
+ setHistoryIndex(newIndex);
249
+ setInputState(history[newIndex]);
250
+ setTextInputKey(prev => prev + 1);
251
+ } else {
252
+ // Clear when going past the first history item
253
+ setHistoryIndex(-2);
254
+ setOriginalInput('');
255
+ updateInput('');
256
+ setTextInputKey(prev => prev + 1);
257
+ }
258
+ } else {
259
+ if (historyIndex >= 0 && historyIndex < history.length - 1) {
260
+ const newIndex = historyIndex + 1;
261
+ setHistoryIndex(newIndex);
262
+ setInputState(history[newIndex]);
263
+ setTextInputKey(prev => prev + 1);
264
+ } else if (historyIndex === history.length - 1) {
265
+ // Restore the full original state (including placeholders)
266
+ setHistoryIndex(-1);
267
+ if (originalInputState) {
268
+ setInputState(originalInputState);
269
+ setOriginalInputState(null);
270
+ } else {
271
+ updateInput(originalInput);
272
+ }
273
+ setOriginalInput('');
274
+ setTextInputKey(prev => prev + 1);
275
+ } else if (historyIndex === -2) {
276
+ // Restore the original input state when pressing down from the empty state
277
+ setHistoryIndex(-1);
278
+ if (originalInputState) {
279
+ setInputState(originalInputState);
280
+ setOriginalInputState(null);
281
+ } else {
282
+ updateInput(originalInput);
283
+ }
284
+ setOriginalInput('');
285
+ setTextInputKey(prev => prev + 1);
286
+ }
287
+ }
288
+ },
289
+ [
290
+ historyIndex,
291
+ input,
292
+ originalInput,
293
+ currentState,
294
+ originalInputState,
295
+ setHistoryIndex,
296
+ setOriginalInput,
297
+ setInputState,
298
+ updateInput,
299
+ ],
300
+ );
301
+
302
+ useInput((inputChar, key) => {
303
+ // Handle escape for cancellation even when disabled
304
+ if (key.escape && disabled && onCancel) {
305
+ onCancel();
306
+ return;
307
+ }
308
+
309
+ // Handle shift+tab to toggle development mode (always available)
310
+ if (key.tab && key.shift && onToggleMode) {
311
+ onToggleMode();
312
+ return;
313
+ }
314
+
315
+ // Block all other input when disabled
316
+ if (disabled) {
317
+ return;
318
+ }
319
+
320
+ // Handle special keys
321
+ if (key.escape) {
322
+ handleEscape();
323
+ return;
324
+ }
325
+
326
+ // Ctrl+B removed - no longer needed with new paste system
327
+
328
+ // Undo: Ctrl+_ (Ctrl+Shift+-)
329
+ if (key.ctrl && inputChar === '_') {
330
+ undo();
331
+ return;
332
+ }
333
+
334
+ // Redo: Ctrl+Y
335
+ if (key.ctrl && inputChar === 'y') {
336
+ redo();
337
+ return;
338
+ }
339
+
340
+ // Handle Tab key
341
+ if (key.tab) {
342
+ // File autocomplete takes priority
343
+ if (isFileAutocompleteMode) {
344
+ void handleFileSelection();
345
+ return;
346
+ }
347
+
348
+ // Command completion - use pre-calculated commandCompletions
349
+ if (input.startsWith('/')) {
350
+ if (commandCompletions.length === 1) {
351
+ // Auto-complete when there's exactly one match
352
+ const completion = commandCompletions[0];
353
+ const completedText = `/${completion.name}`;
354
+ // Use setInputState to bypass paste detection for autocomplete
355
+ setInputState({
356
+ displayValue: completedText,
357
+ placeholderContent: currentState.placeholderContent,
358
+ });
359
+ setTextInputKey(prev => prev + 1);
360
+ } else if (commandCompletions.length > 1) {
361
+ // If completions are already showing, autocomplete to the first result
362
+ if (showCompletions && completions.length > 0) {
363
+ const completion = completions[0];
364
+ const completedText = `/${completion.name}`;
365
+ // Use setInputState to bypass paste detection for autocomplete
366
+ setInputState({
367
+ displayValue: completedText,
368
+ placeholderContent: currentState.placeholderContent,
369
+ });
370
+ setShowCompletions(false);
371
+ setTextInputKey(prev => prev + 1);
372
+ } else {
373
+ // Show completions when there are multiple matches
374
+ setCompletions(commandCompletions);
375
+ setShowCompletions(true);
376
+ }
377
+ }
378
+ return;
379
+ }
380
+ }
381
+
382
+ // Space exits file autocomplete mode
383
+ if (inputChar === ' ' && isFileAutocompleteMode) {
384
+ setIsFileAutocompleteMode(false);
385
+ setFileCompletions([]);
386
+ }
387
+
388
+ // Clear clear message on other input
389
+ if (showClearMessage) {
390
+ setShowClearMessage(false);
391
+ focus('user-input');
392
+ }
393
+
394
+ // Handle return keys for multiline input
395
+ // Support Shift+Enter if the terminal sends it properly
396
+ if (key.return && key.shift) {
397
+ updateInput(input + '\n');
398
+ return;
399
+ }
400
+
401
+ // VSCode terminal sends Option+Enter as '\r' with key.return === false
402
+ // Regular Enter in VSCode sends '\r' with key.return === true
403
+ // So we use key.return to distinguish: false = multiline, true = submit
404
+ if (inputChar === '\r' && !key.return) {
405
+ updateInput(input + '\n');
406
+ return;
407
+ }
408
+
409
+ // Handle navigation
410
+ if (key.upArrow) {
411
+ // File autocomplete navigation takes priority
412
+ if (isFileAutocompleteMode && fileCompletions.length > 0) {
413
+ setSelectedFileIndex(prev =>
414
+ prev > 0 ? prev - 1 : fileCompletions.length - 1,
415
+ );
416
+ return;
417
+ }
418
+ handleHistoryNavigation('up');
419
+ return;
420
+ }
421
+
422
+ if (key.downArrow) {
423
+ // File autocomplete navigation takes priority
424
+ if (isFileAutocompleteMode && fileCompletions.length > 0) {
425
+ setSelectedFileIndex(prev =>
426
+ prev < fileCompletions.length - 1 ? prev + 1 : 0,
427
+ );
428
+ return;
429
+ }
430
+ handleHistoryNavigation('down');
431
+ return;
432
+ }
433
+ });
434
+
435
+ const textColor = disabled || !input ? colors.secondary : colors.primary;
436
+
437
+ // When disabled, show minimal UI to avoid cluttering the screen
438
+ if (disabled) {
439
+ return (
440
+ <Box flexDirection="column" paddingY={1} width="100%" marginTop={1}>
441
+ <Text color={colors.secondary} dimColor>
442
+ <RandomSpinner /> Press Esc to cancel
443
+ </Text>
444
+ <DevelopmentModeIndicator
445
+ developmentMode={developmentMode}
446
+ colors={colors}
447
+ />
448
+ </Box>
449
+ );
450
+ }
451
+
452
+ return (
453
+ <Box flexDirection="column" paddingY={1} width="100%" marginTop={1}>
454
+ <Box
455
+ flexDirection="column"
456
+ borderStyle={isBashMode ? 'round' : undefined}
457
+ borderColor={isBashMode ? colors.tool : undefined}
458
+ paddingX={isBashMode ? 1 : 0}
459
+ width={isBashMode ? boxWidth : undefined}
460
+ >
461
+ {!isBashMode && (
462
+ <>
463
+ <Text color={colors.primary} bold>
464
+ What would you like me to help with?
465
+ </Text>
466
+ </>
467
+ )}
468
+
469
+ {/* Input row */}
470
+ <Box>
471
+ <Text color={textColor}>{'>'} </Text>
472
+ <TextInput
473
+ key={textInputKey}
474
+ value={input}
475
+ onChange={updateInput}
476
+ onSubmit={handleSubmit}
477
+ placeholder={actualPlaceholder}
478
+ focus={isFocused}
479
+ />
480
+ </Box>
481
+
482
+ {isBashMode && (
483
+ <Text color={colors.tool} dimColor>
484
+ Bash Mode
485
+ </Text>
486
+ )}
487
+ {showClearMessage && (
488
+ <Text color={colors.secondary} dimColor>
489
+ Press escape again to clear
490
+ </Text>
491
+ )}
492
+ {showCompletions && completions.length > 0 && (
493
+ <Box flexDirection="column" marginTop={1}>
494
+ <Text color={colors.secondary}>Available commands:</Text>
495
+ {completions.map((completion, index) => (
496
+ <Text
497
+ key={index}
498
+ color={completion.isCustom ? colors.info : colors.primary}
499
+ >
500
+ /{completion.name}
501
+ </Text>
502
+ ))}
503
+ </Box>
504
+ )}
505
+ {isFileAutocompleteMode && fileCompletions.length > 0 && (
506
+ <Box flexDirection="column" marginTop={1}>
507
+ <Text color={colors.secondary}>
508
+ File suggestions (↑/↓ to navigate, Tab to select):
509
+ </Text>
510
+ {fileCompletions.slice(0, 5).map((file, index) => (
511
+ <Text
512
+ key={index}
513
+ color={
514
+ index === selectedFileIndex ? colors.info : colors.primary
515
+ }
516
+ bold={index === selectedFileIndex}
517
+ >
518
+ {index === selectedFileIndex ? '▸ ' : ' '}
519
+ {file.path}
520
+ </Text>
521
+ ))}
522
+ </Box>
523
+ )}
524
+ </Box>
525
+
526
+ {/* Development mode indicator - always visible */}
527
+ <DevelopmentModeIndicator
528
+ developmentMode={developmentMode}
529
+ colors={colors}
530
+ />
531
+ </Box>
532
+ );
533
+ }