@nanocollective/nanocoder 1.17.3 → 1.19.0

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 (688) hide show
  1. package/README.md +178 -13
  2. package/assets/nanocoder-vscode.vsix +0 -0
  3. package/dist/ai-sdk-client-empty-message.spec.d.ts +2 -0
  4. package/dist/ai-sdk-client-empty-message.spec.d.ts.map +1 -0
  5. package/dist/ai-sdk-client-empty-message.spec.js +124 -0
  6. package/dist/ai-sdk-client-empty-message.spec.js.map +1 -0
  7. package/dist/ai-sdk-client.d.ts +19 -3
  8. package/dist/ai-sdk-client.d.ts.map +1 -1
  9. package/dist/ai-sdk-client.js +359 -211
  10. package/dist/ai-sdk-client.js.map +1 -1
  11. package/dist/app/utils/appUtils.d.ts +1 -1
  12. package/dist/app/utils/appUtils.d.ts.map +1 -1
  13. package/dist/app/utils/appUtils.js +80 -14
  14. package/dist/app/utils/appUtils.js.map +1 -1
  15. package/dist/app.d.ts +22 -1
  16. package/dist/app.d.ts.map +1 -1
  17. package/dist/app.js +369 -53
  18. package/dist/app.js.map +1 -1
  19. package/dist/cli.js +37 -2
  20. package/dist/cli.js.map +1 -1
  21. package/dist/cli.spec.d.ts +2 -0
  22. package/dist/cli.spec.d.ts.map +1 -0
  23. package/dist/cli.spec.js +101 -0
  24. package/dist/cli.spec.js.map +1 -0
  25. package/dist/client-factory.d.ts.map +1 -1
  26. package/dist/client-factory.js +2 -2
  27. package/dist/client-factory.js.map +1 -1
  28. package/dist/commands/checkpoint.d.ts +6 -0
  29. package/dist/commands/checkpoint.d.ts.map +1 -0
  30. package/dist/commands/checkpoint.js +277 -0
  31. package/dist/commands/checkpoint.js.map +1 -0
  32. package/dist/commands/clear.d.ts.map +1 -1
  33. package/dist/commands/clear.js +1 -1
  34. package/dist/commands/clear.js.map +1 -1
  35. package/dist/commands/custom-commands.d.ts.map +1 -1
  36. package/dist/commands/custom-commands.js +4 -4
  37. package/dist/commands/custom-commands.js.map +1 -1
  38. package/dist/commands/exit.d.ts.map +1 -1
  39. package/dist/commands/exit.js.map +1 -1
  40. package/dist/commands/export.d.ts.map +1 -1
  41. package/dist/commands/export.js +2 -2
  42. package/dist/commands/export.js.map +1 -1
  43. package/dist/commands/help.d.ts.map +1 -1
  44. package/dist/commands/help.js +5 -5
  45. package/dist/commands/help.js.map +1 -1
  46. package/dist/commands/index.d.ts +2 -2
  47. package/dist/commands/index.d.ts.map +1 -1
  48. package/dist/commands/index.js +2 -2
  49. package/dist/commands/index.js.map +1 -1
  50. package/dist/commands/init.d.ts.map +1 -1
  51. package/dist/commands/init.js +15 -14
  52. package/dist/commands/init.js.map +1 -1
  53. package/dist/commands/lsp.d.ts.map +1 -1
  54. package/dist/commands/lsp.js +6 -6
  55. package/dist/commands/lsp.js.map +1 -1
  56. package/dist/commands/mcp.d.ts +1 -1
  57. package/dist/commands/mcp.d.ts.map +1 -1
  58. package/dist/commands/mcp.js +6 -6
  59. package/dist/commands/mcp.js.map +1 -1
  60. package/dist/commands/model-database.d.ts +8 -0
  61. package/dist/commands/model-database.d.ts.map +1 -0
  62. package/dist/commands/model-database.js +193 -0
  63. package/dist/commands/model-database.js.map +1 -0
  64. package/dist/commands/model.d.ts.map +1 -1
  65. package/dist/commands/model.js.map +1 -1
  66. package/dist/commands/provider.d.ts.map +1 -1
  67. package/dist/commands/provider.js.map +1 -1
  68. package/dist/commands/setup-config.js +1 -1
  69. package/dist/commands/setup-config.js.map +1 -1
  70. package/dist/commands/status.d.ts.map +1 -1
  71. package/dist/commands/status.js.map +1 -1
  72. package/dist/commands/theme.d.ts.map +1 -1
  73. package/dist/commands/theme.js.map +1 -1
  74. package/dist/commands/update.d.ts.map +1 -1
  75. package/dist/commands/update.js +5 -5
  76. package/dist/commands/update.js.map +1 -1
  77. package/dist/commands/usage.d.ts.map +1 -1
  78. package/dist/commands/usage.js +4 -4
  79. package/dist/commands/usage.js.map +1 -1
  80. package/dist/commands.d.ts.map +1 -1
  81. package/dist/commands.js +1 -1
  82. package/dist/commands.js.map +1 -1
  83. package/dist/components/assistant-message.d.ts.map +1 -1
  84. package/dist/components/assistant-message.js +5 -4
  85. package/dist/components/assistant-message.js.map +1 -1
  86. package/dist/components/bash-execution-indicator.d.ts.map +1 -1
  87. package/dist/components/bash-execution-indicator.js +2 -2
  88. package/dist/components/bash-execution-indicator.js.map +1 -1
  89. package/dist/components/cancelling-indicator.js +3 -3
  90. package/dist/components/cancelling-indicator.js.map +1 -1
  91. package/dist/components/chat-queue.d.ts.map +1 -1
  92. package/dist/components/chat-queue.js +1 -1
  93. package/dist/components/chat-queue.js.map +1 -1
  94. package/dist/components/checkpoint-display.d.ts +8 -0
  95. package/dist/components/checkpoint-display.d.ts.map +1 -0
  96. package/dist/components/checkpoint-display.js +29 -0
  97. package/dist/components/checkpoint-display.js.map +1 -0
  98. package/dist/components/checkpoint-selector.d.ts +11 -0
  99. package/dist/components/checkpoint-selector.d.ts.map +1 -0
  100. package/dist/components/checkpoint-selector.js +55 -0
  101. package/dist/components/checkpoint-selector.js.map +1 -0
  102. package/dist/components/error-message.d.ts.map +1 -1
  103. package/dist/components/error-message.js +4 -4
  104. package/dist/components/error-message.js.map +1 -1
  105. package/dist/components/info-message.d.ts.map +1 -1
  106. package/dist/components/info-message.js +4 -4
  107. package/dist/components/info-message.js.map +1 -1
  108. package/dist/components/model-selector.d.ts.map +1 -1
  109. package/dist/components/model-selector.js +7 -7
  110. package/dist/components/model-selector.js.map +1 -1
  111. package/dist/components/provider-selector.d.ts.map +1 -1
  112. package/dist/components/provider-selector.js +6 -6
  113. package/dist/components/provider-selector.js.map +1 -1
  114. package/dist/components/security-disclaimer.d.ts.map +1 -1
  115. package/dist/components/security-disclaimer.js +4 -4
  116. package/dist/components/security-disclaimer.js.map +1 -1
  117. package/dist/components/status.d.ts +5 -0
  118. package/dist/components/status.d.ts.map +1 -1
  119. package/dist/components/status.js +36 -7
  120. package/dist/components/status.js.map +1 -1
  121. package/dist/components/success-message.d.ts.map +1 -1
  122. package/dist/components/success-message.js +4 -4
  123. package/dist/components/success-message.js.map +1 -1
  124. package/dist/components/theme-selector.d.ts.map +1 -1
  125. package/dist/components/theme-selector.js +8 -8
  126. package/dist/components/theme-selector.js.map +1 -1
  127. package/dist/components/tool-confirmation.d.ts.map +1 -1
  128. package/dist/components/tool-confirmation.js +7 -7
  129. package/dist/components/tool-confirmation.js.map +1 -1
  130. package/dist/components/tool-execution-indicator.d.ts.map +1 -1
  131. package/dist/components/tool-execution-indicator.js +2 -2
  132. package/dist/components/tool-execution-indicator.js.map +1 -1
  133. package/dist/components/tool-message.d.ts.map +1 -1
  134. package/dist/components/tool-message.js +4 -5
  135. package/dist/components/tool-message.js.map +1 -1
  136. package/dist/components/ui/titled-box.d.ts +16 -0
  137. package/dist/components/ui/titled-box.d.ts.map +1 -0
  138. package/dist/components/ui/titled-box.js +10 -0
  139. package/dist/components/ui/titled-box.js.map +1 -0
  140. package/dist/components/usage/progress-bar.d.ts.map +1 -1
  141. package/dist/components/usage/progress-bar.js +3 -0
  142. package/dist/components/usage/progress-bar.js.map +1 -1
  143. package/dist/components/usage/usage-display.d.ts.map +1 -1
  144. package/dist/components/usage/usage-display.js +7 -4
  145. package/dist/components/usage/usage-display.js.map +1 -1
  146. package/dist/components/user-input.d.ts.map +1 -1
  147. package/dist/components/user-input.js +9 -8
  148. package/dist/components/user-input.js.map +1 -1
  149. package/dist/components/user-message.d.ts.map +1 -1
  150. package/dist/components/user-message.js +1 -1
  151. package/dist/components/user-message.js.map +1 -1
  152. package/dist/components/vscode-extension-prompt.js +3 -3
  153. package/dist/components/vscode-extension-prompt.js.map +1 -1
  154. package/dist/components/warning-message.d.ts.map +1 -1
  155. package/dist/components/warning-message.js +4 -4
  156. package/dist/components/warning-message.js.map +1 -1
  157. package/dist/components/welcome-message.d.ts.map +1 -1
  158. package/dist/components/welcome-message.js +4 -4
  159. package/dist/components/welcome-message.js.map +1 -1
  160. package/dist/config/index.d.ts.map +1 -1
  161. package/dist/config/index.js +7 -7
  162. package/dist/config/index.js.map +1 -1
  163. package/dist/config/index.spec.js +4 -4
  164. package/dist/config/index.spec.js.map +1 -1
  165. package/dist/config/paths.spec.js +1 -1
  166. package/dist/config/paths.spec.js.map +1 -1
  167. package/dist/config/preferences.d.ts +0 -2
  168. package/dist/config/preferences.d.ts.map +1 -1
  169. package/dist/config/preferences.js +1 -11
  170. package/dist/config/preferences.js.map +1 -1
  171. package/dist/context/mode-context.d.ts +12 -0
  172. package/dist/context/mode-context.d.ts.map +1 -0
  173. package/dist/context/mode-context.js +21 -0
  174. package/dist/context/mode-context.js.map +1 -0
  175. package/dist/context/mode-context.spec.d.ts +2 -0
  176. package/dist/context/mode-context.spec.d.ts.map +1 -0
  177. package/dist/context/mode-context.spec.js +61 -0
  178. package/dist/context/mode-context.spec.js.map +1 -0
  179. package/dist/custom-commands/executor.d.ts.map +1 -1
  180. package/dist/custom-commands/executor.js.map +1 -1
  181. package/dist/custom-commands/loader.d.ts.map +1 -1
  182. package/dist/custom-commands/loader.js +1 -1
  183. package/dist/custom-commands/loader.js.map +1 -1
  184. package/dist/custom-commands/parser.d.ts.map +1 -1
  185. package/dist/custom-commands/parser.js.map +1 -1
  186. package/dist/hooks/useAppInitialization.d.ts +9 -5
  187. package/dist/hooks/useAppInitialization.d.ts.map +1 -1
  188. package/dist/hooks/useAppInitialization.js +119 -45
  189. package/dist/hooks/useAppInitialization.js.map +1 -1
  190. package/dist/hooks/useAppState.d.ts +28 -9
  191. package/dist/hooks/useAppState.d.ts.map +1 -1
  192. package/dist/hooks/useAppState.js +28 -8
  193. package/dist/hooks/useAppState.js.map +1 -1
  194. package/dist/hooks/useChatHandler.d.ts +5 -3
  195. package/dist/hooks/useChatHandler.d.ts.map +1 -1
  196. package/dist/hooks/useChatHandler.js +218 -118
  197. package/dist/hooks/useChatHandler.js.map +1 -1
  198. package/dist/hooks/useDirectoryTrust.js +1 -1
  199. package/dist/hooks/useDirectoryTrust.js.map +1 -1
  200. package/dist/hooks/useInputState.js +2 -2
  201. package/dist/hooks/useInputState.js.map +1 -1
  202. package/dist/hooks/useModeHandlers.d.ts +5 -5
  203. package/dist/hooks/useModeHandlers.d.ts.map +1 -1
  204. package/dist/hooks/useModeHandlers.js +12 -12
  205. package/dist/hooks/useModeHandlers.js.map +1 -1
  206. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  207. package/dist/hooks/useTerminalWidth.js +3 -3
  208. package/dist/hooks/useTerminalWidth.js.map +1 -1
  209. package/dist/hooks/useTheme.d.ts.map +1 -1
  210. package/dist/hooks/useTheme.js +1 -1
  211. package/dist/hooks/useTheme.js.map +1 -1
  212. package/dist/hooks/useToolHandler.d.ts +1 -1
  213. package/dist/hooks/useToolHandler.d.ts.map +1 -1
  214. package/dist/hooks/useToolHandler.js +4 -4
  215. package/dist/hooks/useToolHandler.js.map +1 -1
  216. package/dist/hooks/useUIState.d.ts +1 -1
  217. package/dist/hooks/useUIState.d.ts.map +1 -1
  218. package/dist/hooks/useUIState.js.map +1 -1
  219. package/dist/hooks/useVSCodeServer.js +2 -2
  220. package/dist/hooks/useVSCodeServer.js.map +1 -1
  221. package/dist/init/agents-template-generator.d.ts +1 -1
  222. package/dist/init/agents-template-generator.d.ts.map +1 -1
  223. package/dist/init/agents-template-generator.js.map +1 -1
  224. package/dist/init/existing-rules-extractor.js +1 -1
  225. package/dist/init/existing-rules-extractor.js.map +1 -1
  226. package/dist/init/file-scanner.js +2 -2
  227. package/dist/init/file-scanner.js.map +1 -1
  228. package/dist/init/framework-detector.js +1 -1
  229. package/dist/init/framework-detector.js.map +1 -1
  230. package/dist/init/project-analyzer.d.ts +1 -1
  231. package/dist/init/project-analyzer.d.ts.map +1 -1
  232. package/dist/init/project-analyzer.js +3 -3
  233. package/dist/init/project-analyzer.js.map +1 -1
  234. package/dist/lsp/lsp-client.d.ts +1 -1
  235. package/dist/lsp/lsp-client.d.ts.map +1 -1
  236. package/dist/lsp/lsp-client.js +1 -1
  237. package/dist/lsp/lsp-client.js.map +1 -1
  238. package/dist/lsp/lsp-client.spec.js +1 -2
  239. package/dist/lsp/lsp-client.spec.js.map +1 -1
  240. package/dist/lsp/lsp-manager.d.ts +1 -1
  241. package/dist/lsp/lsp-manager.d.ts.map +1 -1
  242. package/dist/lsp/lsp-manager.js.map +1 -1
  243. package/dist/lsp/lsp-manager.spec.js +1 -1
  244. package/dist/lsp/lsp-manager.spec.js.map +1 -1
  245. package/dist/lsp/protocol.spec.js +1 -1
  246. package/dist/lsp/protocol.spec.js.map +1 -1
  247. package/dist/lsp/server-discovery.spec.js +1 -1
  248. package/dist/lsp/server-discovery.spec.js.map +1 -1
  249. package/dist/markdown-parser/index.spec.js.map +1 -1
  250. package/dist/markdown-parser/table-parser.spec.js.map +1 -1
  251. package/dist/mcp/mcp-client.d.ts +3 -2
  252. package/dist/mcp/mcp-client.d.ts.map +1 -1
  253. package/dist/mcp/mcp-client.js +279 -96
  254. package/dist/mcp/mcp-client.js.map +1 -1
  255. package/dist/mcp/transport-factory.d.ts +1 -1
  256. package/dist/mcp/transport-factory.d.ts.map +1 -1
  257. package/dist/mcp/transport-factory.js +16 -3
  258. package/dist/mcp/transport-factory.js.map +1 -1
  259. package/dist/mcp/transport-factory.spec.js +30 -48
  260. package/dist/mcp/transport-factory.spec.js.map +1 -1
  261. package/dist/message-handler.d.ts +1 -1
  262. package/dist/message-handler.d.ts.map +1 -1
  263. package/dist/message-handler.js +1 -1
  264. package/dist/message-handler.js.map +1 -1
  265. package/dist/model-database/database-engine.d.ts +25 -0
  266. package/dist/model-database/database-engine.d.ts.map +1 -0
  267. package/dist/model-database/database-engine.js +37 -0
  268. package/dist/model-database/database-engine.js.map +1 -0
  269. package/dist/model-database/database-engine.spec.d.ts +2 -0
  270. package/dist/model-database/database-engine.spec.d.ts.map +1 -0
  271. package/dist/model-database/database-engine.spec.js +413 -0
  272. package/dist/model-database/database-engine.spec.js.map +1 -0
  273. package/dist/model-database/model-database.d.ts +30 -0
  274. package/dist/model-database/model-database.d.ts.map +1 -0
  275. package/dist/model-database/model-database.js +82 -0
  276. package/dist/model-database/model-database.js.map +1 -0
  277. package/dist/model-database/model-database.spec.d.ts +2 -0
  278. package/dist/model-database/model-database.spec.d.ts.map +1 -0
  279. package/dist/model-database/model-database.spec.js +322 -0
  280. package/dist/model-database/model-database.spec.js.map +1 -0
  281. package/dist/model-database/model-engine.d.ts +25 -0
  282. package/dist/model-database/model-engine.d.ts.map +1 -0
  283. package/dist/model-database/model-engine.js +49 -0
  284. package/dist/model-database/model-engine.js.map +1 -0
  285. package/dist/model-database/model-engine.spec.d.ts +2 -0
  286. package/dist/model-database/model-engine.spec.d.ts.map +1 -0
  287. package/dist/model-database/model-engine.spec.js +381 -0
  288. package/dist/model-database/model-engine.spec.js.map +1 -0
  289. package/dist/model-database/model-fetcher.d.ts +14 -0
  290. package/dist/model-database/model-fetcher.d.ts.map +1 -0
  291. package/dist/model-database/model-fetcher.js +249 -0
  292. package/dist/model-database/model-fetcher.js.map +1 -0
  293. package/dist/model-database/model-fetcher.spec.d.ts +2 -0
  294. package/dist/model-database/model-fetcher.spec.d.ts.map +1 -0
  295. package/dist/model-database/model-fetcher.spec.js +498 -0
  296. package/dist/model-database/model-fetcher.spec.js.map +1 -0
  297. package/dist/models/models-cache.d.ts +1 -1
  298. package/dist/models/models-cache.d.ts.map +1 -1
  299. package/dist/models/models-cache.js +1 -1
  300. package/dist/models/models-cache.js.map +1 -1
  301. package/dist/models/models-dev-client.d.ts.map +1 -1
  302. package/dist/models/models-dev-client.js +23 -7
  303. package/dist/models/models-dev-client.js.map +1 -1
  304. package/dist/prompt-history.js +2 -2
  305. package/dist/prompt-history.js.map +1 -1
  306. package/dist/services/checkpoint-manager.d.ts +68 -0
  307. package/dist/services/checkpoint-manager.d.ts.map +1 -0
  308. package/dist/services/checkpoint-manager.js +345 -0
  309. package/dist/services/checkpoint-manager.js.map +1 -0
  310. package/dist/services/checkpoint-manager.spec.d.ts +2 -0
  311. package/dist/services/checkpoint-manager.spec.d.ts.map +1 -0
  312. package/dist/services/checkpoint-manager.spec.js +353 -0
  313. package/dist/services/checkpoint-manager.spec.js.map +1 -0
  314. package/dist/services/file-snapshot.d.ts +32 -0
  315. package/dist/services/file-snapshot.d.ts.map +1 -0
  316. package/dist/services/file-snapshot.js +161 -0
  317. package/dist/services/file-snapshot.js.map +1 -0
  318. package/dist/services/file-snapshot.spec.d.ts +2 -0
  319. package/dist/services/file-snapshot.spec.d.ts.map +1 -0
  320. package/dist/services/file-snapshot.spec.js +285 -0
  321. package/dist/services/file-snapshot.spec.js.map +1 -0
  322. package/dist/test-utils/render-with-theme.d.ts +7 -0
  323. package/dist/test-utils/render-with-theme.d.ts.map +1 -0
  324. package/dist/test-utils/render-with-theme.js +38 -0
  325. package/dist/test-utils/render-with-theme.js.map +1 -0
  326. package/dist/tokenization/tokenizer-factory.js +2 -2
  327. package/dist/tokenization/tokenizer-factory.js.map +1 -1
  328. package/dist/tokenization/tokenizer-factory.spec.js +2 -2
  329. package/dist/tokenization/tokenizer-factory.spec.js.map +1 -1
  330. package/dist/tokenization/tokenizers/anthropic-tokenizer.d.ts +1 -1
  331. package/dist/tokenization/tokenizers/anthropic-tokenizer.d.ts.map +1 -1
  332. package/dist/tokenization/tokenizers/anthropic-tokenizer.js.map +1 -1
  333. package/dist/tokenization/tokenizers/anthropic-tokenizer.spec.js.map +1 -1
  334. package/dist/tokenization/tokenizers/fallback-tokenizer.d.ts +1 -1
  335. package/dist/tokenization/tokenizers/fallback-tokenizer.d.ts.map +1 -1
  336. package/dist/tokenization/tokenizers/fallback-tokenizer.spec.js.map +1 -1
  337. package/dist/tokenization/tokenizers/llama-tokenizer.d.ts +1 -1
  338. package/dist/tokenization/tokenizers/llama-tokenizer.d.ts.map +1 -1
  339. package/dist/tokenization/tokenizers/llama-tokenizer.js.map +1 -1
  340. package/dist/tokenization/tokenizers/llama-tokenizer.spec.js.map +1 -1
  341. package/dist/tokenization/tokenizers/openai-tokenizer.d.ts +1 -1
  342. package/dist/tokenization/tokenizers/openai-tokenizer.d.ts.map +1 -1
  343. package/dist/tokenization/tokenizers/openai-tokenizer.js.map +1 -1
  344. package/dist/tokenization/tokenizers/openai-tokenizer.spec.js.map +1 -1
  345. package/dist/tool-calling/json-parser.d.ts.map +1 -1
  346. package/dist/tool-calling/json-parser.js +12 -14
  347. package/dist/tool-calling/json-parser.js.map +1 -1
  348. package/dist/tool-calling/json-parser.spec.js +7 -7
  349. package/dist/tool-calling/json-parser.spec.js.map +1 -1
  350. package/dist/tool-calling/tool-parser.d.ts.map +1 -1
  351. package/dist/tool-calling/tool-parser.js +38 -10
  352. package/dist/tool-calling/tool-parser.js.map +1 -1
  353. package/dist/tool-calling/tool-parser.spec.js +82 -4
  354. package/dist/tool-calling/tool-parser.spec.js.map +1 -1
  355. package/dist/tool-calling/xml-parser.d.ts.map +1 -1
  356. package/dist/tool-calling/xml-parser.js +21 -23
  357. package/dist/tool-calling/xml-parser.js.map +1 -1
  358. package/dist/tool-calling/xml-parser.spec.js +23 -3
  359. package/dist/tool-calling/xml-parser.spec.js.map +1 -1
  360. package/dist/tools/create-file.d.ts +24 -2
  361. package/dist/tools/create-file.d.ts.map +1 -1
  362. package/dist/tools/create-file.js +20 -16
  363. package/dist/tools/create-file.js.map +1 -1
  364. package/dist/tools/delete-lines.d.ts +18 -2
  365. package/dist/tools/delete-lines.d.ts.map +1 -1
  366. package/dist/tools/delete-lines.js +22 -17
  367. package/dist/tools/delete-lines.js.map +1 -1
  368. package/dist/tools/execute-bash.d.ts +2 -2
  369. package/dist/tools/execute-bash.d.ts.map +1 -1
  370. package/dist/tools/execute-bash.js +13 -12
  371. package/dist/tools/execute-bash.js.map +1 -1
  372. package/dist/tools/execute-function.spec.d.ts +2 -0
  373. package/dist/tools/execute-function.spec.d.ts.map +1 -0
  374. package/dist/tools/execute-function.spec.js +141 -0
  375. package/dist/tools/execute-function.spec.js.map +1 -0
  376. package/dist/tools/fetch-url.d.ts +16 -2
  377. package/dist/tools/fetch-url.d.ts.map +1 -1
  378. package/dist/tools/fetch-url.js +13 -13
  379. package/dist/tools/fetch-url.js.map +1 -1
  380. package/dist/tools/find-files.d.ts +18 -2
  381. package/dist/tools/find-files.d.ts.map +1 -1
  382. package/dist/tools/find-files.js +13 -11
  383. package/dist/tools/find-files.js.map +1 -1
  384. package/dist/tools/index.d.ts +2 -3
  385. package/dist/tools/index.d.ts.map +1 -1
  386. package/dist/tools/index.js +35 -25
  387. package/dist/tools/index.js.map +1 -1
  388. package/dist/tools/insert-lines.d.ts +18 -2
  389. package/dist/tools/insert-lines.d.ts.map +1 -1
  390. package/dist/tools/insert-lines.js +21 -16
  391. package/dist/tools/insert-lines.js.map +1 -1
  392. package/dist/tools/lsp-get-diagnostics.d.ts +10 -2
  393. package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -1
  394. package/dist/tools/lsp-get-diagnostics.js +13 -11
  395. package/dist/tools/lsp-get-diagnostics.js.map +1 -1
  396. package/dist/tools/needs-approval.spec.d.ts +2 -0
  397. package/dist/tools/needs-approval.spec.d.ts.map +1 -0
  398. package/dist/tools/needs-approval.spec.js +308 -0
  399. package/dist/tools/needs-approval.spec.js.map +1 -0
  400. package/dist/tools/read-file.d.ts +2 -2
  401. package/dist/tools/read-file.d.ts.map +1 -1
  402. package/dist/tools/read-file.js +16 -18
  403. package/dist/tools/read-file.js.map +1 -1
  404. package/dist/tools/replace-lines.d.ts +19 -2
  405. package/dist/tools/replace-lines.d.ts.map +1 -1
  406. package/dist/tools/replace-lines.js +21 -16
  407. package/dist/tools/replace-lines.js.map +1 -1
  408. package/dist/tools/search-file-contents.d.ts +20 -2
  409. package/dist/tools/search-file-contents.d.ts.map +1 -1
  410. package/dist/tools/search-file-contents.js +17 -14
  411. package/dist/tools/search-file-contents.js.map +1 -1
  412. package/dist/tools/tool-manager.d.ts +1 -1
  413. package/dist/tools/tool-manager.d.ts.map +1 -1
  414. package/dist/tools/tool-manager.js +1 -1
  415. package/dist/tools/tool-manager.js.map +1 -1
  416. package/dist/tools/tool-registry.d.ts +1 -1
  417. package/dist/tools/tool-registry.d.ts.map +1 -1
  418. package/dist/tools/web-search.d.ts +2 -2
  419. package/dist/tools/web-search.d.ts.map +1 -1
  420. package/dist/tools/web-search.js +14 -14
  421. package/dist/tools/web-search.js.map +1 -1
  422. package/dist/types/app.d.ts +7 -4
  423. package/dist/types/app.d.ts.map +1 -1
  424. package/dist/types/checkpoint.d.ts +43 -0
  425. package/dist/types/checkpoint.d.ts.map +1 -0
  426. package/dist/types/checkpoint.js +2 -0
  427. package/dist/types/checkpoint.js.map +1 -0
  428. package/dist/types/config.d.ts +0 -1
  429. package/dist/types/config.d.ts.map +1 -1
  430. package/dist/types/core-connection-status.spec.d.ts +2 -0
  431. package/dist/types/core-connection-status.spec.d.ts.map +1 -0
  432. package/dist/types/core-connection-status.spec.js +52 -0
  433. package/dist/types/core-connection-status.spec.js.map +1 -0
  434. package/dist/types/core.d.ts +34 -29
  435. package/dist/types/core.d.ts.map +1 -1
  436. package/dist/types/core.js +1 -1
  437. package/dist/types/core.js.map +1 -1
  438. package/dist/types/index.d.ts +1 -0
  439. package/dist/types/index.d.ts.map +1 -1
  440. package/dist/types/index.js +1 -0
  441. package/dist/types/index.js.map +1 -1
  442. package/dist/types/system.d.ts +5 -30
  443. package/dist/types/system.d.ts.map +1 -1
  444. package/dist/usage/calculator.spec.js +1 -1
  445. package/dist/usage/calculator.spec.js.map +1 -1
  446. package/dist/usage/storage.d.ts +1 -1
  447. package/dist/usage/storage.d.ts.map +1 -1
  448. package/dist/usage/storage.js +9 -3
  449. package/dist/usage/storage.js.map +1 -1
  450. package/dist/usage/storage.spec.js +3 -3
  451. package/dist/usage/storage.spec.js.map +1 -1
  452. package/dist/usage/tracker.d.ts.map +1 -1
  453. package/dist/usage/tracker.js +1 -1
  454. package/dist/usage/tracker.js.map +1 -1
  455. package/dist/usage/tracker.spec.js +4 -4
  456. package/dist/usage/tracker.spec.js.map +1 -1
  457. package/dist/utils/atomic-deletion.spec.js +1 -1
  458. package/dist/utils/atomic-deletion.spec.js.map +1 -1
  459. package/dist/utils/checkpoint-utils.d.ts +12 -0
  460. package/dist/utils/checkpoint-utils.d.ts.map +1 -0
  461. package/dist/utils/checkpoint-utils.js +85 -0
  462. package/dist/utils/checkpoint-utils.js.map +1 -0
  463. package/dist/utils/checkpoint-utils.spec.d.ts +2 -0
  464. package/dist/utils/checkpoint-utils.spec.d.ts.map +1 -0
  465. package/dist/utils/checkpoint-utils.spec.js +182 -0
  466. package/dist/utils/checkpoint-utils.spec.js.map +1 -0
  467. package/dist/utils/error-formatter.d.ts +35 -0
  468. package/dist/utils/error-formatter.d.ts.map +1 -1
  469. package/dist/utils/error-formatter.js +123 -0
  470. package/dist/utils/error-formatter.js.map +1 -1
  471. package/dist/utils/file-autocomplete.js +2 -2
  472. package/dist/utils/file-autocomplete.js.map +1 -1
  473. package/dist/utils/file-autocomplete.spec.js +1 -1
  474. package/dist/utils/file-autocomplete.spec.js.map +1 -1
  475. package/dist/utils/file-content-loader.js +1 -1
  476. package/dist/utils/file-content-loader.js.map +1 -1
  477. package/dist/utils/file-content-loader.spec.js +4 -4
  478. package/dist/utils/file-content-loader.spec.js.map +1 -1
  479. package/dist/utils/file-mention-handler.js.map +1 -1
  480. package/dist/utils/file-mention-handler.spec.js +4 -4
  481. package/dist/utils/file-mention-handler.spec.js.map +1 -1
  482. package/dist/utils/file-mention-parser.spec.js +2 -2
  483. package/dist/utils/file-mention-parser.spec.js.map +1 -1
  484. package/dist/utils/installation-detector.js +2 -2
  485. package/dist/utils/installation-detector.js.map +1 -1
  486. package/dist/utils/installation-detector.spec.js +10 -17
  487. package/dist/utils/installation-detector.spec.js.map +1 -1
  488. package/dist/utils/logging/config.d.ts +41 -0
  489. package/dist/utils/logging/config.d.ts.map +1 -0
  490. package/dist/utils/logging/config.js +188 -0
  491. package/dist/utils/logging/config.js.map +1 -0
  492. package/dist/utils/logging/config.spec.d.ts +2 -0
  493. package/dist/utils/logging/config.spec.d.ts.map +1 -0
  494. package/dist/utils/logging/config.spec.js +233 -0
  495. package/dist/utils/logging/config.spec.js.map +1 -0
  496. package/dist/utils/logging/console-facade.d.ts +93 -0
  497. package/dist/utils/logging/console-facade.d.ts.map +1 -0
  498. package/dist/utils/logging/console-facade.js +295 -0
  499. package/dist/utils/logging/console-facade.js.map +1 -0
  500. package/dist/utils/logging/console-facade.spec.d.ts +2 -0
  501. package/dist/utils/logging/console-facade.spec.d.ts.map +1 -0
  502. package/dist/utils/logging/console-facade.spec.js +143 -0
  503. package/dist/utils/logging/console-facade.spec.js.map +1 -0
  504. package/dist/utils/logging/correlation.d.ts +139 -0
  505. package/dist/utils/logging/correlation.d.ts.map +1 -0
  506. package/dist/utils/logging/correlation.js +410 -0
  507. package/dist/utils/logging/correlation.js.map +1 -0
  508. package/dist/utils/logging/correlation.spec.d.ts +2 -0
  509. package/dist/utils/logging/correlation.spec.d.ts.map +1 -0
  510. package/dist/utils/logging/correlation.spec.js +449 -0
  511. package/dist/utils/logging/correlation.spec.js.map +1 -0
  512. package/dist/utils/logging/formatters.d.ts +70 -0
  513. package/dist/utils/logging/formatters.d.ts.map +1 -0
  514. package/dist/utils/logging/formatters.js +186 -0
  515. package/dist/utils/logging/formatters.js.map +1 -0
  516. package/dist/utils/logging/formatters.spec.d.ts +2 -0
  517. package/dist/utils/logging/formatters.spec.d.ts.map +1 -0
  518. package/dist/utils/logging/formatters.spec.js +356 -0
  519. package/dist/utils/logging/formatters.spec.js.map +1 -0
  520. package/dist/utils/logging/health-monitor.d.ts +216 -0
  521. package/dist/utils/logging/health-monitor.d.ts.map +1 -0
  522. package/dist/utils/logging/health-monitor.js +760 -0
  523. package/dist/utils/logging/health-monitor.js.map +1 -0
  524. package/dist/utils/logging/health-monitor.spec.d.ts +2 -0
  525. package/dist/utils/logging/health-monitor.spec.d.ts.map +1 -0
  526. package/dist/utils/logging/health-monitor.spec.js +305 -0
  527. package/dist/utils/logging/health-monitor.spec.js.map +1 -0
  528. package/dist/utils/logging/index.d.ts +100 -0
  529. package/dist/utils/logging/index.d.ts.map +1 -0
  530. package/dist/utils/logging/index.js +186 -0
  531. package/dist/utils/logging/index.js.map +1 -0
  532. package/dist/utils/logging/index.spec.d.ts +2 -0
  533. package/dist/utils/logging/index.spec.d.ts.map +1 -0
  534. package/dist/utils/logging/index.spec.js +214 -0
  535. package/dist/utils/logging/index.spec.js.map +1 -0
  536. package/dist/utils/logging/integration.spec.d.ts +2 -0
  537. package/dist/utils/logging/integration.spec.d.ts.map +1 -0
  538. package/dist/utils/logging/integration.spec.js +312 -0
  539. package/dist/utils/logging/integration.spec.js.map +1 -0
  540. package/dist/utils/logging/log-method-factory.d.ts +43 -0
  541. package/dist/utils/logging/log-method-factory.d.ts.map +1 -0
  542. package/dist/utils/logging/log-method-factory.js +176 -0
  543. package/dist/utils/logging/log-method-factory.js.map +1 -0
  544. package/dist/utils/logging/log-method-factory.spec.d.ts +2 -0
  545. package/dist/utils/logging/log-method-factory.spec.d.ts.map +1 -0
  546. package/dist/utils/logging/log-method-factory.spec.js +428 -0
  547. package/dist/utils/logging/log-method-factory.spec.js.map +1 -0
  548. package/dist/utils/logging/log-query.d.ts +275 -0
  549. package/dist/utils/logging/log-query.d.ts.map +1 -0
  550. package/dist/utils/logging/log-query.js +621 -0
  551. package/dist/utils/logging/log-query.js.map +1 -0
  552. package/dist/utils/logging/log-query.spec.d.ts +2 -0
  553. package/dist/utils/logging/log-query.spec.d.ts.map +1 -0
  554. package/dist/utils/logging/log-query.spec.js +737 -0
  555. package/dist/utils/logging/log-query.spec.js.map +1 -0
  556. package/dist/utils/logging/logger-provider.d.ts +73 -0
  557. package/dist/utils/logging/logger-provider.d.ts.map +1 -0
  558. package/dist/utils/logging/logger-provider.js +298 -0
  559. package/dist/utils/logging/logger-provider.js.map +1 -0
  560. package/dist/utils/logging/logger-provider.spec.d.ts +2 -0
  561. package/dist/utils/logging/logger-provider.spec.d.ts.map +1 -0
  562. package/dist/utils/logging/logger-provider.spec.js +204 -0
  563. package/dist/utils/logging/logger-provider.spec.js.map +1 -0
  564. package/dist/utils/logging/performance.d.ts +147 -0
  565. package/dist/utils/logging/performance.d.ts.map +1 -0
  566. package/dist/utils/logging/performance.js +520 -0
  567. package/dist/utils/logging/performance.js.map +1 -0
  568. package/dist/utils/logging/performance.spec.d.ts +2 -0
  569. package/dist/utils/logging/performance.spec.d.ts.map +1 -0
  570. package/dist/utils/logging/performance.spec.js +139 -0
  571. package/dist/utils/logging/performance.spec.js.map +1 -0
  572. package/dist/utils/logging/pino-logger.d.ts +22 -0
  573. package/dist/utils/logging/pino-logger.d.ts.map +1 -0
  574. package/dist/utils/logging/pino-logger.js +372 -0
  575. package/dist/utils/logging/pino-logger.js.map +1 -0
  576. package/dist/utils/logging/pino-logger.spec.d.ts +2 -0
  577. package/dist/utils/logging/pino-logger.spec.d.ts.map +1 -0
  578. package/dist/utils/logging/pino-logger.spec.js +294 -0
  579. package/dist/utils/logging/pino-logger.spec.js.map +1 -0
  580. package/dist/utils/logging/redaction.d.ts +38 -0
  581. package/dist/utils/logging/redaction.d.ts.map +1 -0
  582. package/dist/utils/logging/redaction.js +210 -0
  583. package/dist/utils/logging/redaction.js.map +1 -0
  584. package/dist/utils/logging/redaction.spec.d.ts +2 -0
  585. package/dist/utils/logging/redaction.spec.d.ts.map +1 -0
  586. package/dist/utils/logging/redaction.spec.js +338 -0
  587. package/dist/utils/logging/redaction.spec.js.map +1 -0
  588. package/dist/utils/logging/request-tracker.d.ts +189 -0
  589. package/dist/utils/logging/request-tracker.d.ts.map +1 -0
  590. package/dist/utils/logging/request-tracker.js +569 -0
  591. package/dist/utils/logging/request-tracker.js.map +1 -0
  592. package/dist/utils/logging/request-tracker.spec.d.ts +2 -0
  593. package/dist/utils/logging/request-tracker.spec.d.ts.map +1 -0
  594. package/dist/utils/logging/request-tracker.spec.js +868 -0
  595. package/dist/utils/logging/request-tracker.spec.js.map +1 -0
  596. package/dist/utils/logging/transports.d.ts +55 -0
  597. package/dist/utils/logging/transports.d.ts.map +1 -0
  598. package/dist/utils/logging/transports.js +252 -0
  599. package/dist/utils/logging/transports.js.map +1 -0
  600. package/dist/utils/logging/transports.spec.d.ts +2 -0
  601. package/dist/utils/logging/transports.spec.d.ts.map +1 -0
  602. package/dist/utils/logging/transports.spec.js +390 -0
  603. package/dist/utils/logging/transports.spec.js.map +1 -0
  604. package/dist/utils/logging/types.d.ts +173 -0
  605. package/dist/utils/logging/types.d.ts.map +1 -0
  606. package/dist/utils/logging/types.js +5 -0
  607. package/dist/utils/logging/types.js.map +1 -0
  608. package/dist/utils/message-queue.d.ts +64 -4
  609. package/dist/utils/message-queue.d.ts.map +1 -1
  610. package/dist/utils/message-queue.js +282 -28
  611. package/dist/utils/message-queue.js.map +1 -1
  612. package/dist/utils/paste-utils.spec.js +1 -1
  613. package/dist/utils/paste-utils.spec.js.map +1 -1
  614. package/dist/utils/prompt-processor.d.ts +2 -3
  615. package/dist/utils/prompt-processor.d.ts.map +1 -1
  616. package/dist/utils/prompt-processor.js +4 -52
  617. package/dist/utils/prompt-processor.js.map +1 -1
  618. package/dist/utils/tool-cancellation.spec.js.map +1 -1
  619. package/dist/utils/tool-result-display.d.ts +2 -2
  620. package/dist/utils/tool-result-display.d.ts.map +1 -1
  621. package/dist/utils/tool-result-display.js +3 -3
  622. package/dist/utils/tool-result-display.js.map +1 -1
  623. package/dist/utils/update-checker.d.ts.map +1 -1
  624. package/dist/utils/update-checker.js +1 -1
  625. package/dist/utils/update-checker.js.map +1 -1
  626. package/dist/utils/update-checker.spec.js +2 -2
  627. package/dist/utils/update-checker.spec.js.map +1 -1
  628. package/dist/vscode/extension-installer.js +1 -1
  629. package/dist/vscode/extension-installer.js.map +1 -1
  630. package/dist/vscode/extension-installer.spec.js +1 -1
  631. package/dist/vscode/extension-installer.spec.js.map +1 -1
  632. package/dist/vscode/protocol.spec.js +1 -1
  633. package/dist/vscode/protocol.spec.js.map +1 -1
  634. package/dist/vscode/vscode-server.d.ts.map +1 -1
  635. package/dist/vscode/vscode-server.js +2 -2
  636. package/dist/vscode/vscode-server.js.map +1 -1
  637. package/dist/vscode/vscode-server.spec.js.map +1 -1
  638. package/dist/wizard/config-wizard.d.ts.map +1 -1
  639. package/dist/wizard/config-wizard.js +16 -12
  640. package/dist/wizard/config-wizard.js.map +1 -1
  641. package/dist/wizard/steps/location-step.js +4 -4
  642. package/dist/wizard/steps/location-step.js.map +1 -1
  643. package/dist/wizard/steps/mcp-step.d.ts.map +1 -1
  644. package/dist/wizard/steps/mcp-step.js +4 -4
  645. package/dist/wizard/steps/mcp-step.js.map +1 -1
  646. package/dist/wizard/steps/provider-step.d.ts.map +1 -1
  647. package/dist/wizard/steps/provider-step.js +4 -4
  648. package/dist/wizard/steps/provider-step.js.map +1 -1
  649. package/dist/wizard/steps/summary-step.d.ts.map +1 -1
  650. package/dist/wizard/steps/summary-step.js +2 -2
  651. package/dist/wizard/steps/summary-step.js.map +1 -1
  652. package/dist/wizard/templates/provider-templates.d.ts.map +1 -1
  653. package/dist/wizard/templates/provider-templates.js +66 -2
  654. package/dist/wizard/templates/provider-templates.js.map +1 -1
  655. package/dist/wizard/validation-array.spec.js +1 -1
  656. package/dist/wizard/validation-array.spec.js.map +1 -1
  657. package/dist/wizard/validation.spec.js +1 -1
  658. package/dist/wizard/validation.spec.js.map +1 -1
  659. package/package.json +28 -26
  660. package/source/app/prompts/main-prompt.md +29 -96
  661. package/dist/commands/recommendations.d.ts +0 -8
  662. package/dist/commands/recommendations.d.ts.map +0 -1
  663. package/dist/commands/recommendations.js +0 -311
  664. package/dist/commands/recommendations.js.map +0 -1
  665. package/dist/commands/streaming.d.ts +0 -3
  666. package/dist/commands/streaming.d.ts.map +0 -1
  667. package/dist/commands/streaming.js +0 -23
  668. package/dist/commands/streaming.js.map +0 -1
  669. package/dist/components/thinking-indicator.d.ts +0 -3
  670. package/dist/components/thinking-indicator.d.ts.map +0 -1
  671. package/dist/components/thinking-indicator.js +0 -69
  672. package/dist/components/thinking-indicator.js.map +0 -1
  673. package/dist/recommendations/model-database.d.ts +0 -8
  674. package/dist/recommendations/model-database.d.ts.map +0 -1
  675. package/dist/recommendations/model-database.js +0 -514
  676. package/dist/recommendations/model-database.js.map +0 -1
  677. package/dist/recommendations/model-engine.d.ts +0 -16
  678. package/dist/recommendations/model-engine.d.ts.map +0 -1
  679. package/dist/recommendations/model-engine.js +0 -185
  680. package/dist/recommendations/model-engine.js.map +0 -1
  681. package/dist/recommendations/recommendation-engine.d.ts +0 -39
  682. package/dist/recommendations/recommendation-engine.d.ts.map +0 -1
  683. package/dist/recommendations/recommendation-engine.js +0 -144
  684. package/dist/recommendations/recommendation-engine.js.map +0 -1
  685. package/dist/system/detector.d.ts +0 -18
  686. package/dist/system/detector.d.ts.map +0 -1
  687. package/dist/system/detector.js +0 -140
  688. package/dist/system/detector.js.map +0 -1
@@ -1,17 +1,104 @@
1
+ import { getModelContextLimit } from './models/index.js';
2
+ import { XMLToolCallParser } from './tool-calling/xml-parser.js';
3
+ import { endMetrics, formatMemoryUsage, generateCorrelationId, getCorrelationId, getLogger, startMetrics, withNewCorrelationContext, } from './utils/logging/index.js';
1
4
  import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
2
- import { generateText, streamText } from 'ai';
5
+ import { APICallError, RetryError, generateText, stepCountIs } from 'ai';
3
6
  import { Agent, fetch as undiciFetch } from 'undici';
4
- import { XMLToolCallParser } from './tool-calling/xml-parser.js';
5
- import { getModelContextLimit } from './models/index.js';
7
+ /**
8
+ * Checks if an assistant message is empty (no content and no tool calls).
9
+ * Empty assistant messages cause API errors:
10
+ * "400 Bad Request: Assistant message must have either content or tool_calls, but not none."
11
+ *
12
+ * Exported for testing purposes.
13
+ */
14
+ export function isEmptyAssistantMessage(message) {
15
+ if (message.role !== 'assistant') {
16
+ return false;
17
+ }
18
+ // Check for content - handle both string and array content formats
19
+ const hasContent = Array.isArray(message.content)
20
+ ? message.content.length > 0
21
+ : typeof message.content === 'string' && message.content.trim().length > 0;
22
+ // Tool calls are in a separate property for AI SDK messages
23
+ const hasToolCalls = 'toolCalls' in message &&
24
+ Array.isArray(message.toolCalls) &&
25
+ message.toolCalls.length > 0;
26
+ return !hasContent && !hasToolCalls;
27
+ }
28
+ /**
29
+ * Extracts the root cause error from AI SDK error wrappers.
30
+ * AI SDK wraps errors in RetryError which contains lastError.
31
+ */
32
+ function extractRootError(error) {
33
+ // Handle AI SDK RetryError - extract the last error
34
+ if (RetryError.isInstance(error)) {
35
+ if (error.lastError) {
36
+ return extractRootError(error.lastError);
37
+ }
38
+ }
39
+ return error;
40
+ }
6
41
  /**
7
42
  * Parses API errors into user-friendly messages.
8
43
  * Exported for testing purposes.
9
44
  */
10
45
  export function parseAPIError(error) {
11
- if (!(error instanceof Error)) {
46
+ // First extract the root error from any wrappers
47
+ const rootError = extractRootError(error);
48
+ if (!(rootError instanceof Error)) {
12
49
  return 'An unknown error occurred while communicating with the model';
13
50
  }
14
- const errorMessage = error.message;
51
+ // Handle AI SDK APICallError - it has statusCode and responseBody
52
+ if (APICallError.isInstance(rootError)) {
53
+ const statusCode = rootError.statusCode;
54
+ // Try to extract a clean message from responseBody or use the error message
55
+ let cleanMessage = rootError.message;
56
+ // Parse the response body if available for more details
57
+ if (rootError.responseBody) {
58
+ try {
59
+ const body = JSON.parse(rootError.responseBody);
60
+ if (body.error?.message) {
61
+ cleanMessage = body.error.message;
62
+ }
63
+ else if (body.message) {
64
+ cleanMessage = body.message;
65
+ }
66
+ }
67
+ catch {
68
+ // If not JSON, try to extract message from the raw response
69
+ const msgMatch = rootError.responseBody.match(/["']?message["']?\s*[:=]\s*["']([^"']+)["']/i);
70
+ if (msgMatch) {
71
+ cleanMessage = msgMatch[1];
72
+ }
73
+ }
74
+ }
75
+ // Format based on status code
76
+ if (statusCode) {
77
+ switch (statusCode) {
78
+ case 400:
79
+ return `Bad request: ${cleanMessage}`;
80
+ case 401:
81
+ return 'Authentication failed: Invalid API key or credentials';
82
+ case 403:
83
+ return 'Access forbidden: Check your API permissions';
84
+ case 404:
85
+ return 'Model not found: The requested model may not exist or is unavailable';
86
+ case 429:
87
+ if (cleanMessage.includes('usage limit') ||
88
+ cleanMessage.includes('quota')) {
89
+ return `Rate limit: ${cleanMessage}`;
90
+ }
91
+ return 'Rate limit exceeded: Too many requests. Please wait and try again';
92
+ case 500:
93
+ case 502:
94
+ case 503:
95
+ return `Server error: ${cleanMessage}`;
96
+ default:
97
+ return `Request failed (${statusCode}): ${cleanMessage}`;
98
+ }
99
+ }
100
+ }
101
+ const errorMessage = rootError.message;
15
102
  // Extract status code and clean message from common error patterns FIRST
16
103
  // This ensures HTTP status codes are properly parsed before falling through
17
104
  // to more generic pattern matching (like Ollama-specific errors)
@@ -29,6 +116,11 @@ export function parseAPIError(error) {
29
116
  case '404':
30
117
  return 'Model not found: The requested model may not exist or is unavailable';
31
118
  case '429':
119
+ // Include the original message if it has useful details
120
+ if (cleanMessage.includes('usage limit') ||
121
+ cleanMessage.includes('quota')) {
122
+ return `Rate limit: ${cleanMessage}`;
123
+ }
32
124
  return 'Rate limit exceeded: Too many requests. Please wait and try again';
33
125
  case '500':
34
126
  case '502':
@@ -127,18 +219,24 @@ export class AISDKClient {
127
219
  cachedContextSize;
128
220
  maxRetries;
129
221
  constructor(providerConfig) {
222
+ const logger = getLogger();
130
223
  this.providerConfig = providerConfig;
131
224
  this.availableModels = providerConfig.models;
132
225
  this.currentModel = providerConfig.models[0] || '';
133
226
  this.cachedContextSize = 0;
134
227
  // Default to 2 retries (same as AI SDK default), or use configured value
135
228
  this.maxRetries = providerConfig.maxRetries ?? 2;
136
- const { requestTimeout, socketTimeout, connectionPool } = this.providerConfig;
137
- const resolvedSocketTimeout = socketTimeout === -1
138
- ? 0
139
- : socketTimeout || requestTimeout === -1
140
- ? 0
141
- : requestTimeout || 120000;
229
+ logger.info('AI SDK client initializing', {
230
+ models: this.availableModels,
231
+ defaultModel: this.currentModel,
232
+ provider: providerConfig.name || 'unknown',
233
+ baseUrl: providerConfig.config.baseURL ? '[REDACTED]' : undefined,
234
+ maxRetries: this.maxRetries,
235
+ });
236
+ const { connectionPool } = this.providerConfig;
237
+ const { requestTimeout, socketTimeout } = this.providerConfig;
238
+ const effectiveSocketTimeout = socketTimeout ?? requestTimeout;
239
+ const resolvedSocketTimeout = effectiveSocketTimeout === -1 ? 0 : (effectiveSocketTimeout ?? 120000);
142
240
  this.undiciAgent = new Agent({
143
241
  connect: {
144
242
  timeout: resolvedSocketTimeout,
@@ -195,7 +293,14 @@ export class AISDKClient {
195
293
  });
196
294
  }
197
295
  setModel(model) {
296
+ const logger = getLogger();
297
+ const previousModel = this.currentModel;
198
298
  this.currentModel = model;
299
+ logger.info('Model changed', {
300
+ previousModel,
301
+ newModel: model,
302
+ provider: this.providerConfig.name,
303
+ });
199
304
  // Update context size when model changes
200
305
  void this.updateContextSize();
201
306
  }
@@ -211,223 +316,266 @@ export class AISDKClient {
211
316
  getAvailableModels() {
212
317
  return Promise.resolve(this.availableModels);
213
318
  }
214
- async chat(messages, tools, signal) {
215
- // Check if already aborted before starting
216
- if (signal?.aborted) {
217
- throw new Error('Operation was cancelled');
218
- }
219
- try {
220
- // Get the language model instance from the provider
221
- const model = this.provider(this.currentModel);
222
- // Tools are already in AI SDK format - use directly
223
- const aiTools = Object.keys(tools).length > 0 ? tools : undefined;
224
- // Convert messages to AI SDK v5 ModelMessage format
225
- const modelMessages = convertToModelMessages(messages);
226
- // Use generateText for non-streaming
227
- const result = await generateText({
228
- model,
229
- messages: modelMessages,
230
- tools: aiTools,
231
- abortSignal: signal,
232
- maxRetries: this.maxRetries,
233
- });
234
- // Extract tool calls from result
235
- const toolCalls = [];
236
- if (result.toolCalls && result.toolCalls.length > 0) {
237
- for (const toolCall of result.toolCalls) {
238
- toolCalls.push({
239
- // Some providers (like Ollama) don't provide toolCallId, so generate one
240
- id: toolCall.toolCallId ||
241
- `tool_${Date.now()}_${Math.random().toString(36).substring(7)}`,
242
- function: {
243
- name: toolCall.toolName,
244
- // AI SDK v5 uses 'input' for tool arguments
245
- arguments: toolCall.input,
246
- },
247
- });
248
- }
249
- }
250
- // If no native tool calls but tools are available, try XML parsing
251
- let content = result.text;
252
- if (Object.keys(tools).length > 0 && toolCalls.length === 0 && content) {
253
- // First check for malformed XML tool calls
254
- const malformedError = XMLToolCallParser.detectMalformedToolCall(content);
255
- if (malformedError) {
256
- // Return malformed tool call with validation error
257
- // This mimics how validators work - returns tool call that will show error
258
- toolCalls.push({
259
- id: 'malformed_xml_validation',
260
- function: {
261
- name: '__xml_validation_error__',
262
- arguments: {
263
- error: malformedError.error,
264
- },
265
- },
266
- });
267
- content = ''; // Clear content since it was malformed
268
- }
269
- else if (XMLToolCallParser.hasToolCalls(content)) {
270
- // Try to parse well-formed XML tool calls
271
- const parsedToolCalls = XMLToolCallParser.parseToolCalls(content);
272
- const xmlToolCalls = XMLToolCallParser.convertToToolCalls(parsedToolCalls);
273
- const cleanedContent = XMLToolCallParser.removeToolCallsFromContent(content);
274
- content = cleanedContent;
275
- toolCalls.push(...xmlToolCalls);
276
- }
277
- }
278
- return {
279
- choices: [
280
- {
281
- message: {
282
- role: 'assistant',
283
- content,
284
- tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
285
- },
286
- },
287
- ],
288
- };
289
- }
290
- catch (error) {
291
- // Check if this was a cancellation
292
- if (error instanceof Error && error.name === 'AbortError') {
293
- throw new Error('Operation was cancelled');
294
- }
295
- // Check for AI SDK's NoOutputGeneratedError (thrown when stream is aborted)
296
- if (error instanceof Error &&
297
- (error.name === 'AI_NoOutputGeneratedError' ||
298
- error.message.includes('No output generated'))) {
299
- throw new Error('Operation was cancelled');
300
- }
301
- // Log detailed error for debugging
302
- console.error('AI SDK Error:', error);
303
- if (error instanceof Error) {
304
- console.error('Error message:', error.message);
305
- console.error('Error stack:', error.stack);
306
- }
307
- // Parse and throw a user-friendly error
308
- const userMessage = parseAPIError(error);
309
- throw new Error(userMessage);
310
- }
311
- }
312
319
  /**
313
320
  * Stream chat with real-time token updates
314
321
  */
315
- async chatStream(messages, tools, callbacks, signal) {
322
+ async chat(messages, tools, callbacks, signal) {
323
+ const logger = getLogger();
316
324
  // Check if already aborted before starting
317
325
  if (signal?.aborted) {
326
+ logger.debug('Chat request already aborted');
318
327
  throw new Error('Operation was cancelled');
319
328
  }
320
- try {
321
- // Get the language model instance from the provider
322
- const model = this.provider(this.currentModel);
323
- // Tools are already in AI SDK format - use directly
324
- const aiTools = Object.keys(tools).length > 0 ? tools : undefined;
325
- // Convert messages to AI SDK v5 ModelMessage format
326
- const modelMessages = convertToModelMessages(messages);
327
- // Use streamText for streaming
328
- const result = streamText({
329
- model,
330
- messages: modelMessages,
331
- tools: aiTools,
332
- abortSignal: signal,
333
- maxRetries: this.maxRetries,
334
- });
335
- // Stream tokens
336
- let fullText = '';
337
- for await (const chunk of result.textStream) {
338
- fullText += chunk;
339
- callbacks.onToken?.(chunk);
340
- }
341
- // Wait for completion to get tool calls
342
- const toolCallsResult = await result.toolCalls;
343
- // Extract tool calls
344
- const toolCalls = [];
345
- if (toolCallsResult && toolCallsResult.length > 0) {
346
- for (const toolCall of toolCallsResult) {
347
- const tc = {
348
- // Some providers (like Ollama) don't provide toolCallId, so generate one
349
- id: toolCall.toolCallId ||
350
- `tool_${Date.now()}_${Math.random().toString(36).substring(7)}`,
351
- function: {
352
- name: toolCall.toolName,
353
- // AI SDK v5 uses 'input' for tool arguments
354
- arguments: toolCall.input,
355
- },
356
- };
357
- toolCalls.push(tc);
358
- callbacks.onToolCall?.(tc);
329
+ // Start performance tracking
330
+ const metrics = startMetrics();
331
+ const correlationId = getCorrelationId() || generateCorrelationId();
332
+ logger.info('Chat request starting', {
333
+ model: this.currentModel,
334
+ messageCount: messages.length,
335
+ toolCount: Object.keys(tools).length,
336
+ correlationId,
337
+ provider: this.providerConfig.name,
338
+ });
339
+ return await withNewCorrelationContext(async (_context) => {
340
+ try {
341
+ // Get the language model instance from the provider
342
+ const model = this.provider(this.currentModel);
343
+ // Tools are already in AI SDK format - use directly
344
+ const aiTools = Object.keys(tools).length > 0 ? tools : undefined;
345
+ // Convert messages to AI SDK v5 ModelMessage format
346
+ const modelMessages = convertToModelMessages(messages);
347
+ logger.debug('AI SDK request prepared', {
348
+ messageCount: modelMessages.length,
349
+ hasTools: !!aiTools,
350
+ toolCount: aiTools ? Object.keys(aiTools).length : 0,
351
+ });
352
+ // Tools with needsApproval: false auto-execute in the loop
353
+ // Tools with needsApproval: true cause interruptions for manual approval
354
+ // stopWhen controls when the tool loop stops (max 10 steps)
355
+ const result = await generateText({
356
+ model,
357
+ messages: modelMessages,
358
+ tools: aiTools,
359
+ abortSignal: signal,
360
+ maxRetries: this.maxRetries,
361
+ temperature: 0.6,
362
+ stopWhen: stepCountIs(10), // Allow up to 10 tool execution steps
363
+ // Can be used to add custom logging, metrics, or step tracking
364
+ onStepFinish(step) {
365
+ // Log tool execution steps
366
+ if (step.toolCalls && step.toolCalls.length > 0) {
367
+ logger.trace('AI SDK tool step', {
368
+ stepType: 'tool_execution',
369
+ toolCount: step.toolCalls.length,
370
+ hasResults: !!step.toolResults,
371
+ });
372
+ }
373
+ // Display formatters for auto-executed tools (after execution with results)
374
+ if (step.toolCalls &&
375
+ step.toolResults &&
376
+ step.toolCalls.length === step.toolResults.length) {
377
+ step.toolCalls.forEach((toolCall, idx) => {
378
+ const toolResult = step.toolResults[idx];
379
+ const tc = {
380
+ id: toolCall.toolCallId ||
381
+ `tool_${Date.now()}_${Math.random()
382
+ .toString(36)
383
+ .substring(7)}`,
384
+ function: {
385
+ name: toolCall.toolName,
386
+ arguments: toolCall.input,
387
+ },
388
+ };
389
+ const resultStr = typeof toolResult.output === 'string'
390
+ ? toolResult.output
391
+ : JSON.stringify(toolResult.output);
392
+ logger.debug('Tool executed', {
393
+ toolName: tc.function.name,
394
+ resultLength: resultStr.length,
395
+ });
396
+ callbacks.onToolExecuted?.(tc, resultStr);
397
+ });
398
+ }
399
+ },
400
+ prepareStep: ({ messages }) => {
401
+ // Filter out empty assistant messages that would cause API errors
402
+ // "Assistant message must have either content or tool_calls"
403
+ const filteredMessages = messages.filter(m => !isEmptyAssistantMessage(m));
404
+ // Log message filtering
405
+ if (filteredMessages.length !== messages.length) {
406
+ logger.debug('Filtered empty assistant messages', {
407
+ originalCount: messages.length,
408
+ filteredCount: filteredMessages.length,
409
+ removedCount: messages.length - filteredMessages.length,
410
+ });
411
+ }
412
+ // Return filtered messages if any were removed, otherwise no changes
413
+ if (filteredMessages.length !== messages.length) {
414
+ return { messages: filteredMessages };
415
+ }
416
+ return {}; // No modifications needed
417
+ },
418
+ });
419
+ // Get the full text from the result
420
+ const fullText = result.text;
421
+ logger.debug('AI SDK response received', {
422
+ responseLength: fullText.length,
423
+ hasToolCalls: !!(result.toolCalls && result.toolCalls.length > 0),
424
+ toolCallCount: result.toolCalls?.length || 0,
425
+ });
426
+ // Send the complete text to the callback
427
+ if (fullText) {
428
+ callbacks.onToken?.(fullText);
359
429
  }
360
- }
361
- // Check for XML tool calls if no native ones
362
- let content = fullText;
363
- if (Object.keys(tools).length > 0 && toolCalls.length === 0 && content) {
364
- // First check for malformed XML tool calls
365
- const malformedError = XMLToolCallParser.detectMalformedToolCall(content);
366
- if (malformedError) {
367
- // Return malformed tool call with validation error
368
- // This mimics how validators work - returns tool call that will show error
369
- const malformedCall = {
370
- id: 'malformed_xml_validation',
371
- function: {
372
- name: '__xml_validation_error__',
373
- arguments: {
374
- error: malformedError.error,
430
+ // Get tool calls from result
431
+ const toolCallsResult = result.toolCalls;
432
+ // Can inspect result.steps to see auto-executed tool calls and results
433
+ // const steps = await result.steps;
434
+ // Extract tool calls
435
+ const toolCalls = [];
436
+ if (toolCallsResult && toolCallsResult.length > 0) {
437
+ logger.debug('Processing tool calls from response', {
438
+ toolCallCount: toolCallsResult.length,
439
+ });
440
+ for (const toolCall of toolCallsResult) {
441
+ const tc = {
442
+ // Some providers (like Ollama) don't provide toolCallId, so generate one
443
+ id: toolCall.toolCallId ||
444
+ `tool_${Date.now()}_${Math.random().toString(36).substring(7)}`,
445
+ function: {
446
+ name: toolCall.toolName,
447
+ // AI SDK v5 uses 'input' for tool arguments
448
+ arguments: toolCall.input,
375
449
  },
376
- },
377
- };
378
- toolCalls.push(malformedCall);
379
- callbacks.onToolCall?.(malformedCall);
380
- content = ''; // Clear content since it was malformed
381
- }
382
- else if (XMLToolCallParser.hasToolCalls(content)) {
383
- // Try to parse well-formed XML tool calls
384
- const parsedToolCalls = XMLToolCallParser.parseToolCalls(content);
385
- const xmlToolCalls = XMLToolCallParser.convertToToolCalls(parsedToolCalls);
386
- const cleanedContent = XMLToolCallParser.removeToolCallsFromContent(content);
387
- content = cleanedContent;
388
- for (const tc of xmlToolCalls) {
450
+ };
389
451
  toolCalls.push(tc);
390
- callbacks.onToolCall?.(tc);
452
+ logger.debug('Tool call processed', {
453
+ toolName: tc.function.name,
454
+ hasArguments: !!tc.function.arguments,
455
+ });
456
+ // Note: onToolCall already fired in onStepFinish - no need to call again
391
457
  }
392
458
  }
393
- }
394
- callbacks.onFinish?.();
395
- return {
396
- choices: [
397
- {
398
- message: {
399
- role: 'assistant',
400
- content,
401
- tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
459
+ // Check for XML tool calls if no native ones
460
+ let content = fullText;
461
+ if (Object.keys(tools).length > 0 &&
462
+ toolCalls.length === 0 &&
463
+ content) {
464
+ logger.debug('Checking for XML tool calls in response content');
465
+ // First check for malformed XML tool calls
466
+ const malformedError = XMLToolCallParser.detectMalformedToolCall(content);
467
+ if (malformedError) {
468
+ logger.warn('Malformed XML tool call detected', {
469
+ error: malformedError.error,
470
+ });
471
+ // Return malformed tool call with validation error
472
+ // This mimics how validators work - returns tool call that will show error
473
+ const malformedCall = {
474
+ id: 'malformed_xml_validation',
475
+ function: {
476
+ name: '__xml_validation_error__',
477
+ arguments: {
478
+ error: malformedError.error,
479
+ },
480
+ },
481
+ };
482
+ toolCalls.push(malformedCall);
483
+ callbacks.onToolCall?.(malformedCall);
484
+ content = ''; // Clear content since it was malformed
485
+ }
486
+ else if (XMLToolCallParser.hasToolCalls(content)) {
487
+ logger.debug('Parsing XML tool calls from content');
488
+ // Try to parse well-formed XML tool calls
489
+ const parsedToolCalls = XMLToolCallParser.parseToolCalls(content);
490
+ const xmlToolCalls = XMLToolCallParser.convertToToolCalls(parsedToolCalls);
491
+ const cleanedContent = XMLToolCallParser.removeToolCallsFromContent(content);
492
+ logger.debug('XML tool calls parsed', {
493
+ toolCallCount: xmlToolCalls.length,
494
+ contentLength: cleanedContent.length,
495
+ });
496
+ content = cleanedContent;
497
+ for (const tc of xmlToolCalls) {
498
+ toolCalls.push(tc);
499
+ callbacks.onToolCall?.(tc);
500
+ }
501
+ }
502
+ }
503
+ // Calculate performance metrics
504
+ const finalMetrics = endMetrics(metrics);
505
+ logger.info('Chat request completed successfully', {
506
+ model: this.currentModel,
507
+ duration: `${finalMetrics.duration.toFixed(2)}ms`,
508
+ responseLength: content.length,
509
+ toolCallsFound: toolCalls.length,
510
+ memoryDelta: formatMemoryUsage(finalMetrics.memoryUsage || process.memoryUsage()),
511
+ correlationId,
512
+ provider: this.providerConfig.name,
513
+ });
514
+ callbacks.onFinish?.();
515
+ return {
516
+ choices: [
517
+ {
518
+ message: {
519
+ role: 'assistant',
520
+ content,
521
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
522
+ },
402
523
  },
403
- },
404
- ],
405
- };
406
- }
407
- catch (error) {
408
- // Check if this was a cancellation
409
- if (error instanceof Error && error.name === 'AbortError') {
410
- throw new Error('Operation was cancelled');
524
+ ],
525
+ };
411
526
  }
412
- // Check for AI SDK's NoOutputGeneratedError (thrown when stream is aborted)
413
- if (error instanceof Error &&
414
- (error.name === 'AI_NoOutputGeneratedError' ||
415
- error.message.includes('No output generated'))) {
416
- throw new Error('Operation was cancelled');
417
- }
418
- // Log detailed error for debugging
419
- console.error('AI SDK Error:', error);
420
- if (error instanceof Error) {
421
- console.error('Error message:', error.message);
422
- console.error('Error stack:', error.stack);
527
+ catch (error) {
528
+ // Calculate performance metrics even for errors
529
+ const finalMetrics = endMetrics(metrics);
530
+ // Check if this was a user-initiated cancellation
531
+ if (error instanceof Error && error.name === 'AbortError') {
532
+ logger.info('Chat request cancelled by user', {
533
+ model: this.currentModel,
534
+ duration: `${finalMetrics.duration.toFixed(2)}ms`,
535
+ correlationId,
536
+ provider: this.providerConfig.name,
537
+ });
538
+ throw new Error('Operation was cancelled');
539
+ }
540
+ // Log the error with performance metrics
541
+ logger.error('Chat request failed', {
542
+ model: this.currentModel,
543
+ duration: `${finalMetrics.duration.toFixed(2)}ms`,
544
+ error: error instanceof Error ? error.message : error,
545
+ errorName: error instanceof Error ? error.name : 'Unknown',
546
+ correlationId,
547
+ provider: this.providerConfig.name,
548
+ memoryDelta: formatMemoryUsage(finalMetrics.memoryUsage || process.memoryUsage()),
549
+ });
550
+ // AI SDK wraps errors in NoOutputGeneratedError with no useful cause
551
+ // Check if it's a cancellation without an underlying API error
552
+ if (error instanceof Error &&
553
+ (error.name === 'AI_NoOutputGeneratedError' ||
554
+ error.message.includes('No output generated'))) {
555
+ // Check if there's an underlying RetryError with the real cause
556
+ const rootError = extractRootError(error);
557
+ if (rootError === error) {
558
+ // No underlying error - this is just a cancellation
559
+ throw new Error('Operation was cancelled');
560
+ }
561
+ // There's a real error underneath, parse it
562
+ const userMessage = parseAPIError(rootError);
563
+ throw new Error(userMessage);
564
+ }
565
+ // Parse any other error (including RetryError and APICallError)
566
+ const userMessage = parseAPIError(error);
567
+ throw new Error(userMessage);
423
568
  }
424
- // Parse and throw a user-friendly error
425
- const userMessage = parseAPIError(error);
426
- throw new Error(userMessage);
427
- }
569
+ }, correlationId); // End of withNewCorrelationContext
428
570
  }
429
- async clearContext() {
571
+ clearContext() {
572
+ const logger = getLogger();
573
+ logger.debug('AI SDK client context cleared', {
574
+ model: this.currentModel,
575
+ provider: this.providerConfig.name,
576
+ });
430
577
  // No internal state to clear
578
+ return Promise.resolve();
431
579
  }
432
580
  }
433
581
  //# sourceMappingURL=ai-sdk-client.js.map