@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,102 @@
1
+ /**
2
+ * Usage tracker
3
+ * Tracks current session usage
4
+ */
5
+
6
+ import {randomBytes} from 'node:crypto';
7
+
8
+ import {getModelContextLimit} from '@/models/index';
9
+ import type {Message} from '@/types/core';
10
+ import type {Tokenizer} from '@/types/tokenization';
11
+ import type {CurrentSessionStats, SessionUsage} from '../types/usage';
12
+ import {calculateTokenBreakdown} from './calculator';
13
+ import {addSession} from './storage';
14
+
15
+ export class SessionTracker {
16
+ private sessionId: string;
17
+ private startTime: number;
18
+ private provider: string;
19
+ private model: string;
20
+
21
+ constructor(provider: string, model: string) {
22
+ this.sessionId = this.generateSessionId();
23
+ this.startTime = Date.now();
24
+ this.provider = provider;
25
+ this.model = model;
26
+ }
27
+
28
+ private generateSessionId(): string {
29
+ return `${Date.now()}-${randomBytes(8).toString('hex')}`;
30
+ }
31
+
32
+ async getCurrentStats(
33
+ messages: Message[],
34
+ tokenizer: Tokenizer,
35
+ ): Promise<CurrentSessionStats> {
36
+ const breakdown = calculateTokenBreakdown(messages, tokenizer);
37
+ const contextLimit = await getModelContextLimit(this.model);
38
+ const percentUsed = contextLimit
39
+ ? (breakdown.total / contextLimit) * 100
40
+ : 0;
41
+
42
+ return {
43
+ tokens: breakdown,
44
+ messageCount: messages.length,
45
+ startTime: this.startTime,
46
+ provider: this.provider,
47
+ model: this.model,
48
+ contextLimit,
49
+ percentUsed,
50
+ };
51
+ }
52
+
53
+ saveSession(messages: Message[], tokenizer: Tokenizer): void {
54
+ const breakdown = calculateTokenBreakdown(messages, tokenizer);
55
+ const duration = Date.now() - this.startTime;
56
+
57
+ const session: SessionUsage = {
58
+ id: this.sessionId,
59
+ timestamp: this.startTime,
60
+ provider: this.provider,
61
+ model: this.model,
62
+ tokens: breakdown,
63
+ messageCount: messages.length,
64
+ duration,
65
+ };
66
+
67
+ addSession(session);
68
+ }
69
+
70
+ updateProviderModel(provider: string, model: string): void {
71
+ this.provider = provider;
72
+ this.model = model;
73
+ }
74
+
75
+ getSessionInfo(): {
76
+ id: string;
77
+ startTime: number;
78
+ provider: string;
79
+ model: string;
80
+ } {
81
+ return {
82
+ id: this.sessionId,
83
+ startTime: this.startTime,
84
+ provider: this.provider,
85
+ model: this.model,
86
+ };
87
+ }
88
+ }
89
+
90
+ let currentSessionTracker: SessionTracker | null = null;
91
+
92
+ export function initializeSession(provider: string, model: string): void {
93
+ currentSessionTracker = new SessionTracker(provider, model);
94
+ }
95
+
96
+ export function getCurrentSession(): SessionTracker | null {
97
+ return currentSessionTracker;
98
+ }
99
+
100
+ export function clearCurrentSession(): void {
101
+ currentSessionTracker = null;
102
+ }
@@ -0,0 +1,194 @@
1
+ import test from 'ava';
2
+ import type {InputState, PastePlaceholderContent} from '../types/hooks';
3
+ import {PlaceholderType} from '../types/hooks';
4
+ import {
5
+ findPlaceholderAtPosition,
6
+ handleAtomicDeletion,
7
+ wouldPartiallyDeletePlaceholder,
8
+ } from './atomic-deletion';
9
+
10
+ console.log(`\natomic-deletion.spec.ts`);
11
+
12
+ // Tests for atomic placeholder deletion
13
+ test('handleAtomicDeletion removes placeholder when backspaced', t => {
14
+ const previousState: InputState = {
15
+ displayValue: 'Analyze this: [Paste #123: 500 chars] code',
16
+ placeholderContent: {
17
+ '123': {
18
+ type: PlaceholderType.PASTE,
19
+ displayText: '[Paste #123: 500 chars]',
20
+ content: 'console.log("hello world");',
21
+ originalSize: 500,
22
+ } as PastePlaceholderContent,
23
+ },
24
+ };
25
+
26
+ // Simulate backspacing from the end of the placeholder
27
+ const newText = 'Analyze this: [Paste #123: 500 char code';
28
+
29
+ const result = handleAtomicDeletion(previousState, newText);
30
+
31
+ t.truthy(result);
32
+ t.is(result!.displayValue, 'Analyze this: code');
33
+ t.deepEqual(result!.placeholderContent, {});
34
+ });
35
+
36
+ test('handleAtomicDeletion removes placeholder when deleted from middle', t => {
37
+ const previousState: InputState = {
38
+ displayValue: 'Before [Paste #456: 200 chars] after',
39
+ placeholderContent: {
40
+ '456': {
41
+ type: PlaceholderType.PASTE,
42
+ displayText: '[Paste #456: 200 chars]',
43
+ content: 'function test() { return true; }',
44
+ originalSize: 200,
45
+ } as PastePlaceholderContent,
46
+ },
47
+ };
48
+
49
+ // Simulate deleting part of the placeholder
50
+ const newText = 'Before [Paste #456: 200 ch after';
51
+
52
+ const result = handleAtomicDeletion(previousState, newText);
53
+
54
+ t.truthy(result);
55
+ t.is(result!.displayValue, 'Before after');
56
+ t.deepEqual(result!.placeholderContent, {});
57
+ });
58
+
59
+ test('handleAtomicDeletion preserves other placeholders', t => {
60
+ const previousState: InputState = {
61
+ displayValue:
62
+ 'First [Paste #111: 100 chars] second [Paste #222: 200 chars]',
63
+ placeholderContent: {
64
+ '111': {
65
+ type: PlaceholderType.PASTE,
66
+ displayText: '[Paste #111: 100 chars]',
67
+ content: 'first content',
68
+ originalSize: 100,
69
+ } as PastePlaceholderContent,
70
+ '222': {
71
+ type: PlaceholderType.PASTE,
72
+ displayText: '[Paste #222: 200 chars]',
73
+ content: 'second content',
74
+ originalSize: 200,
75
+ } as PastePlaceholderContent,
76
+ },
77
+ };
78
+
79
+ // Delete part of first placeholder
80
+ const newText = 'First [Paste #111: 100 ch second [Paste #222: 200 chars]';
81
+
82
+ const result = handleAtomicDeletion(previousState, newText);
83
+
84
+ t.truthy(result);
85
+ t.is(result!.displayValue, 'First second [Paste #222: 200 chars]');
86
+ t.deepEqual(result!.placeholderContent, {
87
+ '222': {
88
+ type: PlaceholderType.PASTE,
89
+ displayText: '[Paste #222: 200 chars]',
90
+ content: 'second content',
91
+ originalSize: 200,
92
+ } as PastePlaceholderContent,
93
+ });
94
+ });
95
+
96
+ test('handleAtomicDeletion returns null for normal deletions', t => {
97
+ const previousState: InputState = {
98
+ displayValue: 'Normal text here',
99
+ placeholderContent: {},
100
+ };
101
+
102
+ const newText = 'Normal text her';
103
+
104
+ const result = handleAtomicDeletion(previousState, newText);
105
+
106
+ t.is(result, null);
107
+ });
108
+
109
+ test('handleAtomicDeletion returns null for additions', t => {
110
+ const previousState: InputState = {
111
+ displayValue: 'Short text',
112
+ placeholderContent: {},
113
+ };
114
+
115
+ const newText = 'Short text with more';
116
+
117
+ const result = handleAtomicDeletion(previousState, newText);
118
+
119
+ t.is(result, null);
120
+ });
121
+
122
+ test('findPlaceholderAtPosition finds placeholder ID', t => {
123
+ const text = 'Before [Paste #789: 300 chars] after';
124
+
125
+ // Position inside the placeholder
126
+ const result1 = findPlaceholderAtPosition(text, 10); // Inside "[Paste #789: 300 chars]"
127
+ t.is(result1, '789');
128
+
129
+ // Position outside the placeholder
130
+ const result2 = findPlaceholderAtPosition(text, 0); // In "Before"
131
+ t.is(result2, null);
132
+
133
+ // Position after placeholder
134
+ const result3 = findPlaceholderAtPosition(text, 35); // In "after"
135
+ t.is(result3, null);
136
+ });
137
+
138
+ test('wouldPartiallyDeletePlaceholder detects partial deletion', t => {
139
+ const text = 'Text [Paste #123: 100 chars] more';
140
+ // 01234567890123456789012345678901234
141
+ // 0 1 2 3
142
+ // Placeholder is at position 5-28 (length 23)
143
+
144
+ // Partial deletion from middle of placeholder
145
+ const result1 = wouldPartiallyDeletePlaceholder(text, 8, 5); // Delete "Paste"
146
+ t.true(result1);
147
+
148
+ // Complete deletion of placeholder - delete from position 5, length 23
149
+ const result2 = wouldPartiallyDeletePlaceholder(text, 5, 23); // Delete entire "[Paste #123: 100 chars]"
150
+ t.false(result2);
151
+
152
+ // Deletion outside placeholder
153
+ const result3 = wouldPartiallyDeletePlaceholder(text, 0, 4); // Delete "Text"
154
+ t.false(result3);
155
+ });
156
+
157
+ // Integration test showing complete flow
158
+ test('atomic deletion works with multiple placeholders', t => {
159
+ const previousState: InputState = {
160
+ displayValue:
161
+ 'Compare [Paste #111: 50 chars] with [Paste #222: 100 chars] output',
162
+ placeholderContent: {
163
+ '111': {
164
+ type: PlaceholderType.PASTE,
165
+ displayText: '[Paste #111: 50 chars]',
166
+ content: 'first code block',
167
+ originalSize: 50,
168
+ } as PastePlaceholderContent,
169
+ '222': {
170
+ type: PlaceholderType.PASTE,
171
+ displayText: '[Paste #222: 100 chars]',
172
+ content: 'second code block with more content',
173
+ originalSize: 100,
174
+ } as PastePlaceholderContent,
175
+ },
176
+ };
177
+
178
+ // Delete part of second placeholder
179
+ const newText =
180
+ 'Compare [Paste #111: 50 chars] with [Paste #222: 100 ch output';
181
+
182
+ const result = handleAtomicDeletion(previousState, newText);
183
+
184
+ t.truthy(result);
185
+ t.is(result!.displayValue, 'Compare [Paste #111: 50 chars] with output');
186
+ t.deepEqual(result!.placeholderContent, {
187
+ '111': {
188
+ type: PlaceholderType.PASTE,
189
+ displayText: '[Paste #111: 50 chars]',
190
+ content: 'first code block',
191
+ originalSize: 50,
192
+ } as PastePlaceholderContent,
193
+ });
194
+ });
@@ -0,0 +1,127 @@
1
+ import type {InputState} from '../types/hooks';
2
+
3
+ /**
4
+ * Detect if a text change represents a deletion that should be atomic
5
+ * Returns the modified InputState if atomic deletion occurred, null otherwise
6
+ */
7
+ export function handleAtomicDeletion(
8
+ previousState: InputState,
9
+ newText: string,
10
+ ): InputState | null {
11
+ const previousText = previousState.displayValue;
12
+
13
+ // Only handle deletions (text getting shorter)
14
+ if (newText.length >= previousText.length) {
15
+ return null;
16
+ }
17
+
18
+ // Find what was deleted
19
+ const deletedChars = previousText.length - newText.length;
20
+
21
+ // Find where the deletion occurred
22
+ let deletionStart = -1;
23
+ for (let i = 0; i < Math.min(previousText.length, newText.length); i++) {
24
+ if (previousText[i] !== newText[i]) {
25
+ deletionStart = i;
26
+ break;
27
+ }
28
+ }
29
+
30
+ // If no difference found in common part, deletion was at the end
31
+ if (deletionStart === -1) {
32
+ deletionStart = newText.length;
33
+ }
34
+
35
+ // Check if any placeholder was affected by this deletion
36
+ const placeholderRegex = /\[Paste #(\d+): \d+ chars\]/g;
37
+ let match;
38
+
39
+ while ((match = placeholderRegex.exec(previousText)) !== null) {
40
+ const placeholderStart = match.index;
41
+ const placeholderEnd = placeholderStart + match[0].length;
42
+ const placeholderId = match[1];
43
+
44
+ // Check if deletion overlaps with this placeholder
45
+ const deletionEnd = deletionStart + deletedChars;
46
+
47
+ if (
48
+ (deletionStart >= placeholderStart && deletionStart < placeholderEnd) ||
49
+ (deletionEnd > placeholderStart && deletionEnd <= placeholderEnd) ||
50
+ (deletionStart <= placeholderStart && deletionEnd >= placeholderEnd)
51
+ ) {
52
+ // Deletion affects this placeholder - remove it atomically
53
+ const newDisplayValue = previousText.replace(match[0], '');
54
+ const newPlaceholderContent = {...previousState.placeholderContent};
55
+ delete newPlaceholderContent[placeholderId];
56
+
57
+ return {
58
+ displayValue: newDisplayValue,
59
+ placeholderContent: newPlaceholderContent,
60
+ };
61
+ }
62
+ }
63
+
64
+ return null;
65
+ }
66
+
67
+ /**
68
+ * Find placeholder at cursor position
69
+ * Returns placeholder ID if cursor is within a placeholder, null otherwise
70
+ */
71
+ export function findPlaceholderAtPosition(
72
+ text: string,
73
+ position: number,
74
+ ): string | null {
75
+ const placeholderRegex = /\[Paste #(\d+): \d+ chars\]/g;
76
+ let match;
77
+
78
+ while ((match = placeholderRegex.exec(text)) !== null) {
79
+ const placeholderStart = match.index;
80
+ const placeholderEnd = placeholderStart + match[0].length;
81
+
82
+ if (position >= placeholderStart && position <= placeholderEnd) {
83
+ return match[1]; // Return the placeholder ID
84
+ }
85
+ }
86
+
87
+ return null;
88
+ }
89
+
90
+ /**
91
+ * Check if a deletion would partially affect a placeholder
92
+ * Used to prevent partial placeholder deletions
93
+ */
94
+ export function wouldPartiallyDeletePlaceholder(
95
+ text: string,
96
+ deletionStart: number,
97
+ deletionLength: number,
98
+ ): boolean {
99
+ const placeholderRegex = /\[Paste #(\d+): \d+ chars\]/g;
100
+ let match;
101
+
102
+ while ((match = placeholderRegex.exec(text)) !== null) {
103
+ const placeholderStart = match.index;
104
+ const placeholderEnd = placeholderStart + match[0].length;
105
+ const deletionEnd = deletionStart + deletionLength;
106
+
107
+ // Check for overlap
108
+ const overlapsStart =
109
+ deletionStart >= placeholderStart && deletionStart < placeholderEnd;
110
+ const overlapsEnd =
111
+ deletionEnd > placeholderStart && deletionEnd <= placeholderEnd;
112
+ const spansPast =
113
+ deletionStart < placeholderStart && deletionEnd > placeholderStart;
114
+ const spansOver =
115
+ deletionStart < placeholderEnd && deletionEnd > placeholderEnd;
116
+
117
+ const hasOverlap = overlapsStart || overlapsEnd || spansPast || spansOver;
118
+ const completeOverlap =
119
+ deletionStart <= placeholderStart && deletionEnd >= placeholderEnd;
120
+
121
+ if (hasOverlap && !completeOverlap) {
122
+ return true;
123
+ }
124
+ }
125
+
126
+ return false;
127
+ }