@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,40 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Test script that runs all test:all commands
4
+ # Exit on first error
5
+ set -e
6
+
7
+ echo "🧪 Running all tests..."
8
+ echo ""
9
+
10
+ echo "📝 Checking code formatting..."
11
+ pnpm test:format
12
+ echo ""
13
+ echo "✅ Format check passed"
14
+ echo ""
15
+
16
+ echo "🔍 Checking TypeScript types..."
17
+ pnpm test:types
18
+ echo ""
19
+ echo "✅ Type check passed"
20
+ echo ""
21
+
22
+ echo "🔎 Running linter..."
23
+ pnpm test:lint
24
+ echo ""
25
+ echo "✅ Lint check passed"
26
+ echo ""
27
+
28
+ echo "🧩 Running AVA tests..."
29
+ pnpm test:ava
30
+ echo ""
31
+ echo "✅ AVA tests passed"
32
+ echo ""
33
+
34
+ echo "🗑️ Checking for unused code..."
35
+ pnpm test:knip
36
+ echo ""
37
+ echo "✅ Knip check passed"
38
+ echo ""
39
+
40
+ echo "✅ Everything passes!"
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env bash
2
+ # Update Homebrew formula version and SHA256 hash for a new release
3
+ # Usage: ./scripts/update-homebrew-formula.sh <version>
4
+ # Example: ./scripts/update-homebrew-formula.sh 1.15.0
5
+
6
+ set -e
7
+
8
+ VERSION=$1
9
+ # FORMULA_FILE="Formula/coder.rb"
10
+ NPM_PACKAGE="@gguf/coder"
11
+
12
+ # Color codes for output
13
+ RED='\033[0;31m'
14
+ GREEN='\033[0;32m'
15
+ YELLOW='\033[1;33m'
16
+ NC='\033[0m' # No Color
17
+
18
+ if [ -z "$VERSION" ]; then
19
+ echo -e "${RED}Error: Version number required${NC}"
20
+ echo "Usage: $0 <version>"
21
+ echo "Example: $0 1.15.0"
22
+ exit 1
23
+ fi
24
+
25
+ echo -e "${YELLOW}Updating Homebrew formula to version ${VERSION}...${NC}"
26
+ echo ""
27
+
28
+ # Step 1: Update version in formula file
29
+ echo "Step 1: Updating version number in ${FORMULA_FILE}..."
30
+ NPM_URL="https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-${VERSION}.tgz"
31
+
32
+ if [[ "$OSTYPE" == "darwin"* ]]; then
33
+ # macOS requires -i '' for in-place editing
34
+ sed -i '' "s|url \"https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-.*\.tgz\"|url \"${NPM_URL}\"|" "$FORMULA_FILE"
35
+ else
36
+ # Linux
37
+ sed -i "s|url \"https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-.*\.tgz\"|url \"${NPM_URL}\"|" "$FORMULA_FILE"
38
+ fi
39
+
40
+ # Step 2: Download tarball and calculate SHA256
41
+ echo "Step 2: Downloading tarball from NPM..."
42
+ echo "URL: ${NPM_URL}"
43
+
44
+ TEMP_FILE=$(mktemp)
45
+ trap "rm -f ${TEMP_FILE}" EXIT
46
+
47
+ if ! curl -sSL "${NPM_URL}" -o "${TEMP_FILE}"; then
48
+ echo -e "${RED}Error: Failed to download tarball from NPM${NC}"
49
+ echo "Please verify that version ${VERSION} has been published to NPM"
50
+ echo "Check: https://www.npmjs.com/package/${NPM_PACKAGE}"
51
+ exit 1
52
+ fi
53
+
54
+ echo "Step 3: Calculating SHA256 hash..."
55
+ if command -v shasum >/dev/null 2>&1; then
56
+ # macOS and some Linux systems
57
+ SHA256=$(shasum -a 256 "${TEMP_FILE}" | awk '{print $1}')
58
+ elif command -v sha256sum >/dev/null 2>&1; then
59
+ # Most Linux systems
60
+ SHA256=$(sha256sum "${TEMP_FILE}" | awk '{print $1}')
61
+ else
62
+ echo -e "${RED}Error: Neither shasum nor sha256sum found${NC}"
63
+ echo "Please install one of these tools to calculate SHA256 hashes"
64
+ exit 1
65
+ fi
66
+
67
+ if [ -z "$SHA256" ]; then
68
+ echo -e "${RED}Error: Failed to calculate SHA256 hash${NC}"
69
+ exit 1
70
+ fi
71
+
72
+ echo -e "${GREEN}Found hash: ${SHA256}${NC}"
73
+ echo ""
74
+
75
+ # Step 4: Update formula with real hash
76
+ echo "Step 4: Updating formula with calculated hash..."
77
+ if [[ "$OSTYPE" == "darwin"* ]]; then
78
+ sed -i '' "s/sha256 \".*\"/sha256 \"${SHA256}\"/" "$FORMULA_FILE"
79
+ else
80
+ sed -i "s/sha256 \".*\"/sha256 \"${SHA256}\"/" "$FORMULA_FILE"
81
+ fi
82
+
83
+ # Step 5: Validate formula syntax
84
+ echo "Step 5: Validating formula syntax..."
85
+ if ! ruby -c "$FORMULA_FILE" > /dev/null 2>&1; then
86
+ echo -e "${RED}✗ Formula has syntax errors${NC}"
87
+ ruby -c "$FORMULA_FILE"
88
+ exit 1
89
+ fi
90
+
91
+ echo -e "${GREEN}✓ Formula syntax is valid${NC}"
92
+
93
+ # Step 6: Audit formula (if brew is available)
94
+ if command -v brew >/dev/null 2>&1; then
95
+ echo "Step 6: Auditing formula with Homebrew..."
96
+ # Note: brew audit with path doesn't work in current Homebrew versions
97
+ # This is a known limitation, so we skip it for now
98
+ echo -e "${YELLOW}Note: Automated brew audit is not available for local formulae${NC}"
99
+ echo -e "${YELLOW}Manual audit will be required after pushing to repository${NC}"
100
+ else
101
+ echo -e "${YELLOW}Step 6: Skipping brew audit (brew not installed)${NC}"
102
+ fi
103
+
104
+ echo ""
105
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
106
+ echo -e "${GREEN}Success! Homebrew formula updated to v${VERSION}${NC}"
107
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
108
+ echo ""
109
+ echo "Changes made to: ${FORMULA_FILE}"
110
+ echo ""
111
+ echo "Formula details:"
112
+ echo " Version: ${VERSION}"
113
+ echo " URL: ${NPM_URL}"
114
+ echo " SHA256: ${SHA256}"
115
+ echo ""
116
+ echo "Next steps:"
117
+ echo " 1. Review the changes: git diff ${FORMULA_FILE}"
118
+ echo " 2. Commit: git add ${FORMULA_FILE}"
119
+ echo " 3. Commit: git commit -m 'chore: update homebrew formula to v${VERSION}'"
120
+ echo " 4. Push: git push"
121
+ echo ""
122
+ echo "To test the formula locally:"
123
+ echo " 1. brew tap mochiyaki/coder https://github.com/mochiyaki/coder"
124
+ echo " 2. brew install coder"
125
+ echo " 3. coder --help"
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env bash
2
+ # Update Nix package version and hashes for a new release
3
+ # Usage: ./scripts/update-nix-version.sh <version>
4
+ # Example: ./scripts/update-nix-version.sh 1.15.0
5
+
6
+ set -e
7
+
8
+ VERSION=$1
9
+ SKIP_VERIFY=$2
10
+ NIX_FILE="nix/packages/default/default.nix"
11
+ FAKE_HASH="sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
12
+
13
+ # Color codes for output
14
+ RED='\033[0;31m'
15
+ GREEN='\033[0;32m'
16
+ YELLOW='\033[1;33m'
17
+ NC='\033[0m' # No Color
18
+
19
+ if [ -z "$VERSION" ]; then
20
+ echo -e "${RED}Error: Version number required${NC}"
21
+ echo "Usage: $0 <version> [--skip-verify]"
22
+ echo "Example: $0 1.15.0"
23
+ echo "Example: $0 1.15.0 --skip-verify"
24
+ exit 1
25
+ fi
26
+
27
+ echo -e "${YELLOW}Updating Nix package to version ${VERSION}...${NC}"
28
+ echo ""
29
+
30
+ # Step 1: Update version in nix file
31
+ echo "Step 1: Updating version number in ${NIX_FILE}..."
32
+ if [[ "$OSTYPE" == "darwin"* ]]; then
33
+ sed -i '' "s|version = \".*\";|version = \"${VERSION}\";|" "$NIX_FILE"
34
+ else
35
+ sed -i "s|version = \".*\";|version = \"${VERSION}\";|" "$NIX_FILE"
36
+ fi
37
+
38
+ # Step 2: Insert fake source hash
39
+ echo "Step 2: Using fake source hash to trigger hash calculation..."
40
+ if [[ "$OSTYPE" == "darwin"* ]]; then
41
+ sed -i '' "s|sha256 = \".*\";|sha256 = \"${FAKE_HASH}\";|" "$NIX_FILE"
42
+ else
43
+ sed -i "s|sha256 = \".*\";|sha256 = \"${FAKE_HASH}\";|" "$NIX_FILE"
44
+ fi
45
+
46
+ # Step 3: Build to get the real source hash
47
+ echo "Step 3: Building package to get correct source hash..."
48
+ echo -e "${YELLOW}(This will fail - that's expected!)${NC}"
49
+ echo ""
50
+
51
+ BUILD_OUTPUT=$(nix build .#default 2>&1 || true)
52
+ SOURCE_HASH=$(echo "$BUILD_OUTPUT" | sed -n 's/.*got:[[:space:]]*\(sha256-[A-Za-z0-9+/=]*\).*/\1/p' | head -1)
53
+
54
+ if [ -z "$SOURCE_HASH" ]; then
55
+ echo -e "${RED}Error: Could not extract source hash from build output${NC}"
56
+ echo "Build output:"
57
+ echo "$BUILD_OUTPUT"
58
+ exit 1
59
+ fi
60
+
61
+ echo -e "${GREEN}Found source hash: ${SOURCE_HASH}${NC}"
62
+ echo ""
63
+
64
+ # Step 4: Update with real source hash
65
+ echo "Step 4: Updating with correct source hash..."
66
+ if [[ "$OSTYPE" == "darwin"* ]]; then
67
+ sed -i '' "s|sha256 = \".*\";|sha256 = \"${SOURCE_HASH}\";|" "$NIX_FILE"
68
+ else
69
+ sed -i "s|sha256 = \".*\";|sha256 = \"${SOURCE_HASH}\";|" "$NIX_FILE"
70
+ fi
71
+
72
+ # Step 5: Insert fake pnpmDeps hash
73
+ echo "Step 5: Using fake pnpmDeps hash to trigger hash calculation..."
74
+ if [[ "$OSTYPE" == "darwin"* ]]; then
75
+ sed -i '' "s|hash = \".*\";|hash = \"${FAKE_HASH}\";|" "$NIX_FILE"
76
+ else
77
+ sed -i "s|hash = \".*\";|hash = \"${FAKE_HASH}\";|" "$NIX_FILE"
78
+ fi
79
+
80
+ # Step 6: Build to get the real pnpmDeps hash
81
+ echo "Step 6: Building package to get correct pnpmDeps hash..."
82
+ echo -e "${YELLOW}(This will fail - that's expected!)${NC}"
83
+ echo ""
84
+
85
+ BUILD_OUTPUT=$(nix build .#default 2>&1 || true)
86
+ PNPM_HASH=$(echo "$BUILD_OUTPUT" | sed -n 's/.*got:[[:space:]]*\(sha256-[A-Za-z0-9+/=]*\).*/\1/p' | head -1)
87
+
88
+ if [ -z "$PNPM_HASH" ]; then
89
+ echo -e "${RED}Error: Could not extract pnpmDeps hash from build output${NC}"
90
+ echo "Build output:"
91
+ echo "$BUILD_OUTPUT"
92
+ exit 1
93
+ fi
94
+
95
+ echo -e "${GREEN}Found pnpmDeps hash: ${PNPM_HASH}${NC}"
96
+ echo ""
97
+
98
+ # Step 7: Update with real pnpmDeps hash
99
+ echo "Step 7: Updating with correct pnpmDeps hash..."
100
+ if [[ "$OSTYPE" == "darwin"* ]]; then
101
+ sed -i '' "s|hash = \".*\";|hash = \"${PNPM_HASH}\";|" "$NIX_FILE"
102
+ else
103
+ sed -i "s|hash = \".*\";|hash = \"${PNPM_HASH}\";|" "$NIX_FILE"
104
+ fi
105
+
106
+ # Step 8: Build again to verify (unless --skip-verify is passed)
107
+ if [ "$SKIP_VERIFY" = "--skip-verify" ]; then
108
+ echo "Step 8: Skipping verification build (--skip-verify flag passed)"
109
+ echo ""
110
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
111
+ echo -e "${GREEN}Success! Nix package updated to v${VERSION}${NC}"
112
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
113
+ echo ""
114
+ echo "Changes made to: ${NIX_FILE}"
115
+ echo ""
116
+ echo "Source hash: ${SOURCE_HASH}"
117
+ echo "pnpmDeps hash: ${PNPM_HASH}"
118
+ echo ""
119
+ echo -e "${YELLOW}Note: Verification build was skipped. Run 'nix build .#default' locally to verify.${NC}"
120
+ else
121
+ echo "Step 8: Verifying build with correct hashes..."
122
+ if nix build .#default; then
123
+ echo -e "${GREEN}✓ Build successful!${NC}"
124
+ echo ""
125
+
126
+ # Test the binary exists
127
+ echo "Step 9: Verifying binary exists..."
128
+ if [ -f "./result/bin/coder" ] && [ -x "./result/bin/coder" ]; then
129
+ echo -e "${GREEN}✓ Binary exists and is executable!${NC}"
130
+ else
131
+ echo -e "${YELLOW}⚠ Warning: Binary not found or not executable${NC}"
132
+ fi
133
+
134
+ # Clean up
135
+ rm -f result
136
+
137
+ echo ""
138
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
139
+ echo -e "${GREEN}Success! Nix package updated to v${VERSION}${NC}"
140
+ echo -e "${GREEN}════════════════════════════════════════════════${NC}"
141
+ echo ""
142
+ echo "Changes made to: ${NIX_FILE}"
143
+ echo ""
144
+ echo "Source hash: ${SOURCE_HASH}"
145
+ echo "pnpmDeps hash: ${PNPM_HASH}"
146
+ echo ""
147
+ echo "Next steps:"
148
+ echo " 1. Review the changes: git diff ${NIX_FILE}"
149
+ echo " 2. Commit: git add ${NIX_FILE}"
150
+ echo " 3. Commit: git commit -m 'chore: update nix package to v${VERSION}'"
151
+ echo " 4. Push: git push"
152
+ else
153
+ echo -e "${RED}✗ Build failed with correct hashes${NC}"
154
+ echo "Please check the build output above for errors."
155
+ exit 1
156
+ fi
157
+ fi
@@ -0,0 +1,117 @@
1
+ import test from 'ava';
2
+ import type {AIProviderConfig} from '@/types/index';
3
+ import {AISDKClient} from './AISDKClient.js';
4
+
5
+ test('AISDKClient constructor initializes with config', t => {
6
+ const config: AIProviderConfig = {
7
+ name: 'TestProvider',
8
+ type: 'openai',
9
+ models: ['test-model-1', 'test-model-2'],
10
+ config: {
11
+ baseURL: 'https://api.test.com',
12
+ apiKey: 'test-key',
13
+ },
14
+ };
15
+
16
+ const client = new AISDKClient(config);
17
+
18
+ t.is(client.getCurrentModel(), 'test-model-1');
19
+ t.is(client.getContextSize(), 0); // Not yet loaded
20
+ t.is(client.getMaxRetries(), 2); // Default value
21
+ });
22
+
23
+ test('AISDKClient.create returns a Promise', async t => {
24
+ const config: AIProviderConfig = {
25
+ name: 'TestProvider',
26
+ type: 'openai',
27
+ models: ['test-model'],
28
+ config: {
29
+ baseURL: 'https://api.test.com',
30
+ apiKey: 'test-key',
31
+ },
32
+ };
33
+
34
+ const client = await AISDKClient.create(config);
35
+
36
+ t.truthy(client);
37
+ t.true(client instanceof AISDKClient);
38
+ });
39
+
40
+ test('AISDKClient setModel updates current model', t => {
41
+ const config: AIProviderConfig = {
42
+ name: 'TestProvider',
43
+ type: 'openai',
44
+ models: ['model-1', 'model-2'],
45
+ config: {
46
+ baseURL: 'https://api.test.com',
47
+ },
48
+ };
49
+
50
+ const client = new AISDKClient(config);
51
+ t.is(client.getCurrentModel(), 'model-1');
52
+
53
+ client.setModel('model-2');
54
+ t.is(client.getCurrentModel(), 'model-2');
55
+ });
56
+
57
+ test('AISDKClient getAvailableModels returns models array', async t => {
58
+ const config: AIProviderConfig = {
59
+ name: 'TestProvider',
60
+ type: 'openai',
61
+ models: ['model-1', 'model-2', 'model-3'],
62
+ config: {
63
+ baseURL: 'https://api.test.com',
64
+ },
65
+ };
66
+
67
+ const client = new AISDKClient(config);
68
+ const models = await client.getAvailableModels();
69
+
70
+ t.deepEqual(models, ['model-1', 'model-2', 'model-3']);
71
+ });
72
+
73
+ test('AISDKClient clearContext resolves successfully', async t => {
74
+ const config: AIProviderConfig = {
75
+ name: 'TestProvider',
76
+ type: 'openai',
77
+ models: ['test-model'],
78
+ config: {
79
+ baseURL: 'https://api.test.com',
80
+ },
81
+ };
82
+
83
+ const client = new AISDKClient(config);
84
+
85
+ await t.notThrowsAsync(async () => {
86
+ await client.clearContext();
87
+ });
88
+ });
89
+
90
+ test('AISDKClient uses custom maxRetries from config', t => {
91
+ const config: AIProviderConfig = {
92
+ name: 'TestProvider',
93
+ type: 'openai',
94
+ models: ['test-model'],
95
+ maxRetries: 5,
96
+ config: {
97
+ baseURL: 'https://api.test.com',
98
+ },
99
+ };
100
+
101
+ const client = new AISDKClient(config);
102
+ t.is(client.getMaxRetries(), 5);
103
+ });
104
+
105
+ test('AISDKClient handles config without models', t => {
106
+ const config: AIProviderConfig = {
107
+ name: 'TestProvider',
108
+ type: 'openai',
109
+ models: [],
110
+ config: {
111
+ baseURL: 'https://api.test.com',
112
+ },
113
+ };
114
+
115
+ const client = new AISDKClient(config);
116
+ t.is(client.getCurrentModel(), '');
117
+ });
@@ -0,0 +1,155 @@
1
+ import {TIMEOUT_SOCKET_DEFAULT_MS} from '@/constants';
2
+ import {getModelContextLimit} from '@/models/index.js';
3
+ import type {
4
+ AIProviderConfig,
5
+ AISDKCoreTool,
6
+ LLMChatResponse,
7
+ LLMClient,
8
+ Message,
9
+ StreamCallbacks,
10
+ } from '@/types/index';
11
+ import {getLogger} from '@/utils/logging';
12
+ import {createOpenAICompatible} from '@ai-sdk/openai-compatible';
13
+ import type {LanguageModel} from 'ai';
14
+ import {Agent} from 'undici';
15
+ import {handleChat} from './chat/chat-handler.js';
16
+ import {createProvider} from './providers/provider-factory.js';
17
+
18
+ export class AISDKClient implements LLMClient {
19
+ private provider: ReturnType<typeof createOpenAICompatible>;
20
+ private currentModel: string;
21
+ private availableModels: string[];
22
+ private providerConfig: AIProviderConfig;
23
+ private undiciAgent: Agent;
24
+ private cachedContextSize: number;
25
+ private maxRetries: number;
26
+
27
+ constructor(providerConfig: AIProviderConfig) {
28
+ const logger = getLogger();
29
+
30
+ this.providerConfig = providerConfig;
31
+ this.availableModels = providerConfig.models;
32
+ this.currentModel = providerConfig.models[0] || '';
33
+ this.cachedContextSize = 0;
34
+ // Default to 2 retries (same as AI SDK default), or use configured value
35
+ this.maxRetries = providerConfig.maxRetries ?? 2;
36
+
37
+ logger.info('AI SDK client initializing', {
38
+ models: this.availableModels,
39
+ defaultModel: this.currentModel,
40
+ provider: providerConfig.name || 'unknown',
41
+ baseUrl: providerConfig.config.baseURL ? '[REDACTED]' : undefined,
42
+ maxRetries: this.maxRetries,
43
+ });
44
+
45
+ const {connectionPool} = this.providerConfig;
46
+ const {requestTimeout, socketTimeout} = this.providerConfig;
47
+ const effectiveSocketTimeout = socketTimeout ?? requestTimeout;
48
+ const resolvedSocketTimeout =
49
+ effectiveSocketTimeout === -1
50
+ ? 0
51
+ : (effectiveSocketTimeout ?? TIMEOUT_SOCKET_DEFAULT_MS);
52
+
53
+ this.undiciAgent = new Agent({
54
+ connect: {
55
+ timeout: resolvedSocketTimeout,
56
+ },
57
+ bodyTimeout: resolvedSocketTimeout,
58
+ headersTimeout: resolvedSocketTimeout,
59
+ keepAliveTimeout: connectionPool?.idleTimeout,
60
+ keepAliveMaxTimeout: connectionPool?.cumulativeMaxIdleTimeout,
61
+ });
62
+
63
+ this.provider = createProvider(this.providerConfig, this.undiciAgent);
64
+
65
+ // Fetch context size asynchronously (don't block construction)
66
+ void this.updateContextSize();
67
+ }
68
+
69
+ /**
70
+ * Fetch and cache context size from models.dev
71
+ */
72
+ private async updateContextSize(): Promise<void> {
73
+ try {
74
+ const contextSize = await getModelContextLimit(this.currentModel);
75
+ this.cachedContextSize = contextSize || 0;
76
+ } catch {
77
+ // Silently fail - context size will remain 0
78
+ this.cachedContextSize = 0;
79
+ }
80
+ }
81
+
82
+ static create(providerConfig: AIProviderConfig): Promise<AISDKClient> {
83
+ const client = new AISDKClient(providerConfig);
84
+ return Promise.resolve(client);
85
+ }
86
+
87
+ setModel(model: string): void {
88
+ const logger = getLogger();
89
+ const previousModel = this.currentModel;
90
+
91
+ this.currentModel = model;
92
+
93
+ logger.info('Model changed', {
94
+ previousModel,
95
+ newModel: model,
96
+ provider: this.providerConfig.name,
97
+ });
98
+
99
+ // Update context size when model changes
100
+ void this.updateContextSize();
101
+ }
102
+
103
+ getCurrentModel(): string {
104
+ return this.currentModel;
105
+ }
106
+
107
+ getContextSize(): number {
108
+ return this.cachedContextSize;
109
+ }
110
+
111
+ getMaxRetries(): number {
112
+ return this.maxRetries;
113
+ }
114
+
115
+ getAvailableModels(): Promise<string[]> {
116
+ return Promise.resolve(this.availableModels);
117
+ }
118
+
119
+ /**
120
+ * Stream chat with real-time token updates
121
+ */
122
+ async chat(
123
+ messages: Message[],
124
+ tools: Record<string, AISDKCoreTool>,
125
+ callbacks: StreamCallbacks,
126
+ signal?: AbortSignal,
127
+ ): Promise<LLMChatResponse> {
128
+ // Get the language model instance from the provider
129
+ const model = this.provider(this.currentModel) as unknown as LanguageModel;
130
+
131
+ // Delegate to chat handler
132
+ return await handleChat({
133
+ model,
134
+ currentModel: this.currentModel,
135
+ providerConfig: this.providerConfig,
136
+ messages,
137
+ tools,
138
+ callbacks,
139
+ signal,
140
+ maxRetries: this.maxRetries,
141
+ });
142
+ }
143
+
144
+ clearContext(): Promise<void> {
145
+ const logger = getLogger();
146
+
147
+ logger.debug('AI SDK client context cleared', {
148
+ model: this.currentModel,
149
+ provider: this.providerConfig.name,
150
+ });
151
+
152
+ // No internal state to clear
153
+ return Promise.resolve();
154
+ }
155
+ }