whale-code 6.5.4 → 6.5.6

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 (853) hide show
  1. package/README.md +39 -31
  2. package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
  3. package/dist/cli/app.js +148 -72
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/cli/chat/AgentSelector.js +105 -10
  6. package/dist/cli/chat/AgentSelector.js.map +1 -0
  7. package/dist/cli/chat/ChatApp.d.ts +31 -0
  8. package/dist/cli/chat/ChatApp.js +539 -286
  9. package/dist/cli/chat/ChatApp.js.map +1 -0
  10. package/dist/cli/chat/ChatInput.js +1088 -770
  11. package/dist/cli/chat/ChatInput.js.map +1 -0
  12. package/dist/cli/chat/MarkdownText.js +39 -14
  13. package/dist/cli/chat/MarkdownText.js.map +1 -0
  14. package/dist/cli/chat/MemoryManager.js +181 -46
  15. package/dist/cli/chat/MemoryManager.js.map +1 -0
  16. package/dist/cli/chat/MessageList.d.ts +2 -3
  17. package/dist/cli/chat/MessageList.js +186 -45
  18. package/dist/cli/chat/MessageList.js.map +1 -0
  19. package/dist/cli/chat/ModelSelector.js +282 -63
  20. package/dist/cli/chat/ModelSelector.js.map +1 -0
  21. package/dist/cli/chat/NodeManager.js +165 -75
  22. package/dist/cli/chat/NodeManager.js.map +1 -0
  23. package/dist/cli/chat/NodeSelector.js +171 -30
  24. package/dist/cli/chat/NodeSelector.js.map +1 -0
  25. package/dist/cli/chat/PlanApproval.js +281 -57
  26. package/dist/cli/chat/PlanApproval.js.map +1 -0
  27. package/dist/cli/chat/RewindViewer.js +559 -144
  28. package/dist/cli/chat/RewindViewer.js.map +1 -0
  29. package/dist/cli/chat/SessionManager.js +137 -30
  30. package/dist/cli/chat/SessionManager.js.map +1 -0
  31. package/dist/cli/chat/SlashMenu.js +293 -164
  32. package/dist/cli/chat/SlashMenu.js.map +1 -0
  33. package/dist/cli/chat/StatusBar.js +172 -9
  34. package/dist/cli/chat/StatusBar.js.map +1 -0
  35. package/dist/cli/chat/StoreSelector.js +147 -18
  36. package/dist/cli/chat/StoreSelector.js.map +1 -0
  37. package/dist/cli/chat/StreamingText.d.ts +1 -5
  38. package/dist/cli/chat/StreamingText.js +22 -7
  39. package/dist/cli/chat/StreamingText.js.map +1 -0
  40. package/dist/cli/chat/SubagentPanel.d.ts +1 -2
  41. package/dist/cli/chat/SubagentPanel.js +612 -72
  42. package/dist/cli/chat/SubagentPanel.js.map +1 -0
  43. package/dist/cli/chat/TeamPanel.d.ts +1 -0
  44. package/dist/cli/chat/TeamPanel.js +230 -30
  45. package/dist/cli/chat/TeamPanel.js.map +1 -0
  46. package/dist/cli/chat/ThemeSelector.js +84 -24
  47. package/dist/cli/chat/ThemeSelector.js.map +1 -0
  48. package/dist/cli/chat/ToolIndicator.js +1476 -371
  49. package/dist/cli/chat/ToolIndicator.js.map +1 -0
  50. package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
  51. package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
  52. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
  53. package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
  54. package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
  55. package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
  56. package/dist/cli/commands/config-cmd.js +56 -57
  57. package/dist/cli/commands/config-cmd.js.map +1 -0
  58. package/dist/cli/commands/db.js +184 -169
  59. package/dist/cli/commands/db.js.map +1 -0
  60. package/dist/cli/commands/doctor.js +212 -122
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/init.js +211 -244
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/mcp.js +127 -122
  65. package/dist/cli/commands/mcp.js.map +1 -0
  66. package/dist/cli/login/LoginApp.js +355 -141
  67. package/dist/cli/login/LoginApp.js.map +1 -0
  68. package/dist/cli/print-mode.js +196 -177
  69. package/dist/cli/print-mode.js.map +1 -0
  70. package/dist/cli/serve-mode.js +615 -530
  71. package/dist/cli/serve-mode.js.map +1 -0
  72. package/dist/cli/services/agent-config.d.ts +29 -0
  73. package/dist/cli/services/agent-config.js +91 -0
  74. package/dist/cli/services/agent-config.js.map +1 -0
  75. package/dist/cli/services/agent-definitions.d.ts +4 -1
  76. package/dist/cli/services/agent-definitions.js +97 -56
  77. package/dist/cli/services/agent-definitions.js.map +1 -0
  78. package/dist/cli/services/agent-events.js +225 -162
  79. package/dist/cli/services/agent-events.js.map +1 -0
  80. package/dist/cli/services/agent-loop.js +978 -669
  81. package/dist/cli/services/agent-loop.js.map +1 -0
  82. package/dist/cli/services/agent-worker-base.d.ts +35 -5
  83. package/dist/cli/services/agent-worker-base.js +337 -153
  84. package/dist/cli/services/agent-worker-base.js.map +1 -0
  85. package/dist/cli/services/api-retry.js +69 -64
  86. package/dist/cli/services/api-retry.js.map +1 -0
  87. package/dist/cli/services/auth-service.d.ts +3 -3
  88. package/dist/cli/services/auth-service.js +209 -132
  89. package/dist/cli/services/auth-service.js.map +1 -0
  90. package/dist/cli/services/background-processes.js +343 -267
  91. package/dist/cli/services/background-processes.js.map +1 -0
  92. package/dist/cli/services/browser-auth.d.ts +2 -2
  93. package/dist/cli/services/browser-auth.js +159 -118
  94. package/dist/cli/services/browser-auth.js.map +1 -0
  95. package/dist/cli/services/claude-md-loader.js +40 -36
  96. package/dist/cli/services/claude-md-loader.js.map +1 -0
  97. package/dist/cli/services/config-store.d.ts +9 -4
  98. package/dist/cli/services/config-store.js +164 -117
  99. package/dist/cli/services/config-store.js.map +1 -0
  100. package/dist/cli/services/debug-log.d.ts +1 -1
  101. package/dist/cli/services/debug-log.js +34 -35
  102. package/dist/cli/services/debug-log.js.map +1 -0
  103. package/dist/cli/services/env-detect.d.ts +7 -0
  104. package/dist/cli/services/env-detect.js +9 -0
  105. package/dist/cli/services/env-detect.js.map +1 -0
  106. package/dist/cli/services/error-logger.d.ts +2 -3
  107. package/dist/cli/services/error-logger.js +189 -180
  108. package/dist/cli/services/error-logger.js.map +1 -0
  109. package/dist/cli/services/file-history.d.ts +1 -1
  110. package/dist/cli/services/file-history.js +50 -54
  111. package/dist/cli/services/file-history.js.map +1 -0
  112. package/dist/cli/services/format-server-response.js +332 -372
  113. package/dist/cli/services/format-server-response.js.map +1 -0
  114. package/dist/cli/services/git-context.js +61 -45
  115. package/dist/cli/services/git-context.js.map +1 -0
  116. package/dist/cli/services/hooks.d.ts +2 -2
  117. package/dist/cli/services/hooks.js +195 -180
  118. package/dist/cli/services/hooks.js.map +1 -0
  119. package/dist/cli/services/ink-incremental.d.ts +19 -0
  120. package/dist/cli/services/ink-incremental.js +59 -0
  121. package/dist/cli/services/ink-incremental.js.map +1 -0
  122. package/dist/cli/services/ink-resize-fix.js +54 -44
  123. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  124. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  125. package/dist/cli/services/ink-sync-output.js +16 -0
  126. package/dist/cli/services/ink-sync-output.js.map +1 -0
  127. package/dist/cli/services/interactive-tools.js +268 -212
  128. package/dist/cli/services/interactive-tools.js.map +1 -0
  129. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  130. package/dist/cli/services/keybinding-manager.js +126 -63
  131. package/dist/cli/services/keybinding-manager.js.map +1 -0
  132. package/dist/cli/services/local-tools.d.ts +1 -1
  133. package/dist/cli/services/local-tools.js +939 -656
  134. package/dist/cli/services/local-tools.js.map +1 -0
  135. package/dist/cli/services/lsp-manager.js +757 -594
  136. package/dist/cli/services/lsp-manager.js.map +1 -0
  137. package/dist/cli/services/mcp-client.d.ts +1 -1
  138. package/dist/cli/services/mcp-client.js +173 -134
  139. package/dist/cli/services/mcp-client.js.map +1 -0
  140. package/dist/cli/services/memory-manager.js +53 -40
  141. package/dist/cli/services/memory-manager.js.map +1 -0
  142. package/dist/cli/services/model-manager.js +55 -40
  143. package/dist/cli/services/model-manager.js.map +1 -0
  144. package/dist/cli/services/model-router.js +115 -85
  145. package/dist/cli/services/model-router.js.map +1 -0
  146. package/dist/cli/services/paths.d.ts +30 -0
  147. package/dist/cli/services/paths.js +81 -0
  148. package/dist/cli/services/paths.js.map +1 -0
  149. package/dist/cli/services/permission-modes.js +32 -25
  150. package/dist/cli/services/permission-modes.js.map +1 -0
  151. package/dist/cli/services/rewind.js +182 -168
  152. package/dist/cli/services/rewind.js.map +1 -0
  153. package/dist/cli/services/ripgrep.js +115 -115
  154. package/dist/cli/services/ripgrep.js.map +1 -0
  155. package/dist/cli/services/sandbox.d.ts +1 -1
  156. package/dist/cli/services/sandbox.js +58 -37
  157. package/dist/cli/services/sandbox.js.map +1 -0
  158. package/dist/cli/services/server-tools.js +738 -565
  159. package/dist/cli/services/server-tools.js.map +1 -0
  160. package/dist/cli/services/session-persistence.js +69 -74
  161. package/dist/cli/services/session-persistence.js.map +1 -0
  162. package/dist/cli/services/subagent-worker.js +42 -27
  163. package/dist/cli/services/subagent-worker.js.map +1 -0
  164. package/dist/cli/services/subagent.d.ts +2 -0
  165. package/dist/cli/services/subagent.js +606 -430
  166. package/dist/cli/services/subagent.js.map +1 -0
  167. package/dist/cli/services/system-prompt.js +86 -78
  168. package/dist/cli/services/system-prompt.js.map +1 -0
  169. package/dist/cli/services/task-decomposer.d.ts +1 -1
  170. package/dist/cli/services/task-decomposer.js +172 -139
  171. package/dist/cli/services/task-decomposer.js.map +1 -0
  172. package/dist/cli/services/team-lead.d.ts +2 -2
  173. package/dist/cli/services/team-lead.js +727 -529
  174. package/dist/cli/services/team-lead.js.map +1 -0
  175. package/dist/cli/services/team-state.js +319 -319
  176. package/dist/cli/services/team-state.js.map +1 -0
  177. package/dist/cli/services/teammate.d.ts +8 -2
  178. package/dist/cli/services/teammate.js +862 -560
  179. package/dist/cli/services/teammate.js.map +1 -0
  180. package/dist/cli/services/telemetry.d.ts +6 -1
  181. package/dist/cli/services/telemetry.js +180 -157
  182. package/dist/cli/services/telemetry.js.map +1 -0
  183. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  184. package/dist/cli/services/tools/agent-tools.js +480 -322
  185. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  186. package/dist/cli/services/tools/file-ops.js +563 -450
  187. package/dist/cli/services/tools/file-ops.js.map +1 -0
  188. package/dist/cli/services/tools/search-tools.js +231 -162
  189. package/dist/cli/services/tools/search-tools.js.map +1 -0
  190. package/dist/cli/services/tools/shell-exec.js +197 -151
  191. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  192. package/dist/cli/services/tools/task-manager.js +206 -173
  193. package/dist/cli/services/tools/task-manager.js.map +1 -0
  194. package/dist/cli/services/tools/web-tools.js +388 -341
  195. package/dist/cli/services/tools/web-tools.js.map +1 -0
  196. package/dist/cli/setup/SetupApp.d.ts +2 -2
  197. package/dist/cli/setup/SetupApp.js +608 -160
  198. package/dist/cli/setup/SetupApp.js.map +1 -0
  199. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  200. package/dist/cli/shared/ErrorBoundary.js +73 -0
  201. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  202. package/dist/cli/shared/MatrixIntro.js +66 -69
  203. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  204. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  205. package/dist/cli/shared/SpinnerSlot.js +63 -0
  206. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  207. package/dist/cli/shared/Theme.d.ts +1 -1
  208. package/dist/cli/shared/Theme.js +136 -92
  209. package/dist/cli/shared/Theme.js.map +1 -0
  210. package/dist/cli/shared/WhaleBanner.js +99 -11
  211. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  212. package/dist/cli/shared/markdown.d.ts +3 -1
  213. package/dist/cli/shared/markdown.js +736 -674
  214. package/dist/cli/shared/markdown.js.map +1 -0
  215. package/dist/cli/shared/marked-terminal.d.js +2 -0
  216. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  217. package/dist/cli/shared/theme-manager.js +99 -90
  218. package/dist/cli/shared/theme-manager.js.map +1 -0
  219. package/dist/cli/shared/theme-presets.js +256 -254
  220. package/dist/cli/shared/theme-presets.js.map +1 -0
  221. package/dist/cli/status/StatusApp.js +235 -86
  222. package/dist/cli/status/StatusApp.js.map +1 -0
  223. package/dist/cli/stores/StoreApp.js +275 -65
  224. package/dist/cli/stores/StoreApp.js.map +1 -0
  225. package/dist/index.d.ts +2 -2
  226. package/dist/index.js +509 -396
  227. package/dist/index.js.map +1 -0
  228. package/dist/local-agent/connection.d.ts +2 -2
  229. package/dist/local-agent/connection.js +352 -293
  230. package/dist/local-agent/connection.js.map +1 -0
  231. package/dist/local-agent/discovery.js +259 -122
  232. package/dist/local-agent/discovery.js.map +1 -0
  233. package/dist/local-agent/executor.js +216 -193
  234. package/dist/local-agent/executor.js.map +1 -0
  235. package/dist/local-agent/index.d.ts +2 -2
  236. package/dist/local-agent/index.js +156 -156
  237. package/dist/local-agent/index.js.map +1 -0
  238. package/dist/node/adapters/base.js +18 -8
  239. package/dist/node/adapters/base.js.map +1 -0
  240. package/dist/node/adapters/discord.js +286 -275
  241. package/dist/node/adapters/discord.js.map +1 -0
  242. package/dist/node/adapters/email.js +189 -202
  243. package/dist/node/adapters/email.js.map +1 -0
  244. package/dist/node/adapters/imessage.js +145 -142
  245. package/dist/node/adapters/imessage.js.map +1 -0
  246. package/dist/node/adapters/slack.js +237 -236
  247. package/dist/node/adapters/slack.js.map +1 -0
  248. package/dist/node/adapters/sms.js +149 -151
  249. package/dist/node/adapters/sms.js.map +1 -0
  250. package/dist/node/adapters/telegram.js +88 -92
  251. package/dist/node/adapters/telegram.js.map +1 -0
  252. package/dist/node/adapters/webchat.js +160 -136
  253. package/dist/node/adapters/webchat.js.map +1 -0
  254. package/dist/node/adapters/whatsapp.js +212 -215
  255. package/dist/node/adapters/whatsapp.js.map +1 -0
  256. package/dist/node/cli.js +884 -653
  257. package/dist/node/cli.js.map +1 -0
  258. package/dist/node/config.js +20 -18
  259. package/dist/node/config.js.map +1 -0
  260. package/dist/node/gateway-client.js +191 -181
  261. package/dist/node/gateway-client.js.map +1 -0
  262. package/dist/node/portal/clipboard.js +161 -130
  263. package/dist/node/portal/clipboard.js.map +1 -0
  264. package/dist/node/portal/discovery.js +51 -45
  265. package/dist/node/portal/discovery.js.map +1 -0
  266. package/dist/node/portal/forward.js +64 -58
  267. package/dist/node/portal/forward.js.map +1 -0
  268. package/dist/node/portal/index.js +246 -221
  269. package/dist/node/portal/index.js.map +1 -0
  270. package/dist/node/portal/multiplexer.js +192 -182
  271. package/dist/node/portal/multiplexer.js.map +1 -0
  272. package/dist/node/portal/permissions.js +102 -70
  273. package/dist/node/portal/permissions.js.map +1 -0
  274. package/dist/node/portal/protocol.js +153 -116
  275. package/dist/node/portal/protocol.js.map +1 -0
  276. package/dist/node/portal/screen.js +80 -69
  277. package/dist/node/portal/screen.js.map +1 -0
  278. package/dist/node/portal/session.js +124 -117
  279. package/dist/node/portal/session.js.map +1 -0
  280. package/dist/node/portal/shell.js +140 -113
  281. package/dist/node/portal/shell.js.map +1 -0
  282. package/dist/node/portal/stream.js +77 -75
  283. package/dist/node/portal/stream.js.map +1 -0
  284. package/dist/node/portal/transfer.js +190 -167
  285. package/dist/node/portal/transfer.js.map +1 -0
  286. package/dist/node/portal/ui.js +124 -99
  287. package/dist/node/portal/ui.js.map +1 -0
  288. package/dist/node/remote-desktop/compile-helper.js +50 -45
  289. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  290. package/dist/node/remote-desktop/index.js +215 -187
  291. package/dist/node/remote-desktop/index.js.map +1 -0
  292. package/dist/node/remote-desktop/protocol.js +45 -29
  293. package/dist/node/remote-desktop/protocol.js.map +1 -0
  294. package/dist/node/runtime.js +493 -410
  295. package/dist/node/runtime.js.map +1 -0
  296. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  297. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  298. package/dist/server/handlers/analytics.js +467 -261
  299. package/dist/server/handlers/analytics.js.map +1 -0
  300. package/dist/server/handlers/api-docs.d.ts +6 -0
  301. package/dist/server/handlers/api-docs.js +1613 -0
  302. package/dist/server/handlers/api-docs.js.map +1 -0
  303. package/dist/server/handlers/api-keys.js +295 -232
  304. package/dist/server/handlers/api-keys.js.map +1 -0
  305. package/dist/server/handlers/billing.js +330 -239
  306. package/dist/server/handlers/billing.js.map +1 -0
  307. package/dist/server/handlers/browser.js +468 -395
  308. package/dist/server/handlers/browser.js.map +1 -0
  309. package/dist/server/handlers/catalog.js +1377 -978
  310. package/dist/server/handlers/catalog.js.map +1 -0
  311. package/dist/server/handlers/clickhouse.js +157 -109
  312. package/dist/server/handlers/clickhouse.js.map +1 -0
  313. package/dist/server/handlers/comms.d.ts +0 -53
  314. package/dist/server/handlers/comms.js +1443 -970
  315. package/dist/server/handlers/comms.js.map +1 -0
  316. package/dist/server/handlers/creations.js +461 -394
  317. package/dist/server/handlers/creations.js.map +1 -0
  318. package/dist/server/handlers/crm.js +1082 -791
  319. package/dist/server/handlers/crm.js.map +1 -0
  320. package/dist/server/handlers/discovery.js +251 -232
  321. package/dist/server/handlers/discovery.js.map +1 -0
  322. package/dist/server/handlers/embeddings.js +241 -164
  323. package/dist/server/handlers/embeddings.js.map +1 -0
  324. package/dist/server/handlers/enrichment.js +887 -718
  325. package/dist/server/handlers/enrichment.js.map +1 -0
  326. package/dist/server/handlers/image-gen.js +467 -376
  327. package/dist/server/handlers/image-gen.js.map +1 -0
  328. package/dist/server/handlers/inventory.js +797 -424
  329. package/dist/server/handlers/inventory.js.map +1 -0
  330. package/dist/server/handlers/kali.js +272 -230
  331. package/dist/server/handlers/kali.js.map +1 -0
  332. package/dist/server/handlers/llm-providers.js +803 -580
  333. package/dist/server/handlers/llm-providers.js.map +1 -0
  334. package/dist/server/handlers/local-agent.js +133 -105
  335. package/dist/server/handlers/local-agent.js.map +1 -0
  336. package/dist/server/handlers/media.js +1179 -857
  337. package/dist/server/handlers/media.js.map +1 -0
  338. package/dist/server/handlers/meta-ads.js +2669 -2093
  339. package/dist/server/handlers/meta-ads.js.map +1 -0
  340. package/dist/server/handlers/nodes.js +1321 -913
  341. package/dist/server/handlers/nodes.js.map +1 -0
  342. package/dist/server/handlers/operations.js +183 -157
  343. package/dist/server/handlers/operations.js.map +1 -0
  344. package/dist/server/handlers/platform.js +346 -210
  345. package/dist/server/handlers/platform.js.map +1 -0
  346. package/dist/server/handlers/remove-bg.js +118 -86
  347. package/dist/server/handlers/remove-bg.js.map +1 -0
  348. package/dist/server/handlers/storefront.js +586 -446
  349. package/dist/server/handlers/storefront.js.map +1 -0
  350. package/dist/server/handlers/supply-chain.js +546 -326
  351. package/dist/server/handlers/supply-chain.js.map +1 -0
  352. package/dist/server/handlers/transcription.js +106 -97
  353. package/dist/server/handlers/transcription.js.map +1 -0
  354. package/dist/server/handlers/video-gen.js +593 -424
  355. package/dist/server/handlers/video-gen.js.map +1 -0
  356. package/dist/server/handlers/voice.js +1458 -1017
  357. package/dist/server/handlers/voice.js.map +1 -0
  358. package/dist/server/handlers/workflow-steps.js +2837 -2116
  359. package/dist/server/handlers/workflow-steps.js.map +1 -0
  360. package/dist/server/handlers/workflows.js +1630 -933
  361. package/dist/server/handlers/workflows.js.map +1 -0
  362. package/dist/server/index.js +3166 -2390
  363. package/dist/server/index.js.map +1 -0
  364. package/dist/server/lib/batch-client.js +471 -409
  365. package/dist/server/lib/batch-client.js.map +1 -0
  366. package/dist/server/lib/clickhouse-buffer.js +118 -104
  367. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  368. package/dist/server/lib/clickhouse-client.js +107 -107
  369. package/dist/server/lib/clickhouse-client.js.map +1 -0
  370. package/dist/server/lib/coa-renderer.js +1786 -356
  371. package/dist/server/lib/coa-renderer.js.map +1 -0
  372. package/dist/server/lib/code-worker-pool.js +227 -177
  373. package/dist/server/lib/code-worker-pool.js.map +1 -0
  374. package/dist/server/lib/code-worker.js +174 -164
  375. package/dist/server/lib/code-worker.js.map +1 -0
  376. package/dist/server/lib/compaction-service.d.ts +2 -12
  377. package/dist/server/lib/compaction-service.js +74 -184
  378. package/dist/server/lib/compaction-service.js.map +1 -0
  379. package/dist/server/lib/logger.js +36 -24
  380. package/dist/server/lib/logger.js.map +1 -0
  381. package/dist/server/lib/otel.js +101 -80
  382. package/dist/server/lib/otel.js.map +1 -0
  383. package/dist/server/lib/pdf-renderer.d.ts +1 -1
  384. package/dist/server/lib/pdf-renderer.js +954 -776
  385. package/dist/server/lib/pdf-renderer.js.map +1 -0
  386. package/dist/server/lib/prompt-sanitizer.js +188 -108
  387. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  388. package/dist/server/lib/provider-capabilities.js +136 -138
  389. package/dist/server/lib/provider-capabilities.js.map +1 -0
  390. package/dist/server/lib/provider-failover.js +190 -168
  391. package/dist/server/lib/provider-failover.js.map +1 -0
  392. package/dist/server/lib/rate-limiter.js +186 -117
  393. package/dist/server/lib/rate-limiter.js.map +1 -0
  394. package/dist/server/lib/react-pdf-layout.js +551 -382
  395. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  396. package/dist/server/lib/server-agent-loop.d.ts +9 -0
  397. package/dist/server/lib/server-agent-loop.js +906 -624
  398. package/dist/server/lib/server-agent-loop.js.map +1 -0
  399. package/dist/server/lib/server-subagent.d.ts +2 -0
  400. package/dist/server/lib/server-subagent.js +260 -162
  401. package/dist/server/lib/server-subagent.js.map +1 -0
  402. package/dist/server/lib/session-checkpoint.js +105 -96
  403. package/dist/server/lib/session-checkpoint.js.map +1 -0
  404. package/dist/server/lib/ssrf-guard.js +193 -184
  405. package/dist/server/lib/ssrf-guard.js.map +1 -0
  406. package/dist/server/lib/supabase-client.js +94 -82
  407. package/dist/server/lib/supabase-client.js.map +1 -0
  408. package/dist/server/lib/template-resolver.js +154 -176
  409. package/dist/server/lib/template-resolver.js.map +1 -0
  410. package/dist/server/lib/utils.js +242 -133
  411. package/dist/server/lib/utils.js.map +1 -0
  412. package/dist/server/local-agent-gateway.d.ts +2 -2
  413. package/dist/server/local-agent-gateway.js +785 -627
  414. package/dist/server/local-agent-gateway.js.map +1 -0
  415. package/dist/server/providers/anthropic.js +254 -176
  416. package/dist/server/providers/anthropic.js.map +1 -0
  417. package/dist/server/providers/bedrock.js +221 -162
  418. package/dist/server/providers/bedrock.js.map +1 -0
  419. package/dist/server/providers/gemini.js +548 -418
  420. package/dist/server/providers/gemini.js.map +1 -0
  421. package/dist/server/providers/openai.js +571 -437
  422. package/dist/server/providers/openai.js.map +1 -0
  423. package/dist/server/providers/registry.js +23 -18
  424. package/dist/server/providers/registry.js.map +1 -0
  425. package/dist/server/providers/shared.js +123 -95
  426. package/dist/server/providers/shared.js.map +1 -0
  427. package/dist/server/providers/types.js +1 -11
  428. package/dist/server/providers/types.js.map +1 -0
  429. package/dist/server/proxy-handlers.js +209 -165
  430. package/dist/server/proxy-handlers.js.map +1 -0
  431. package/dist/server/tool-router.d.ts +13 -0
  432. package/dist/server/tool-router.js +960 -598
  433. package/dist/server/tool-router.js.map +1 -0
  434. package/dist/server/validation.js +248 -188
  435. package/dist/server/validation.js.map +1 -0
  436. package/dist/server/worker.js +202 -133
  437. package/dist/server/worker.js.map +1 -0
  438. package/dist/setup.d.ts +2 -2
  439. package/dist/setup.js +151 -147
  440. package/dist/setup.js.map +1 -0
  441. package/dist/shared/agent-core.d.ts +191 -24
  442. package/dist/shared/agent-core.js +971 -462
  443. package/dist/shared/agent-core.js.map +1 -0
  444. package/dist/shared/anthropic-types.js +1 -6
  445. package/dist/shared/anthropic-types.js.map +1 -0
  446. package/dist/shared/api-client.d.ts +17 -9
  447. package/dist/shared/api-client.js +419 -327
  448. package/dist/shared/api-client.js.map +1 -0
  449. package/dist/shared/compaction.d.ts +36 -0
  450. package/dist/shared/compaction.js +138 -0
  451. package/dist/shared/compaction.js.map +1 -0
  452. package/dist/shared/constants.js +67 -64
  453. package/dist/shared/constants.js.map +1 -0
  454. package/dist/shared/sse-parser.js +221 -219
  455. package/dist/shared/sse-parser.js.map +1 -0
  456. package/dist/shared/tool-dispatch.d.ts +4 -2
  457. package/dist/shared/tool-dispatch.js +226 -165
  458. package/dist/shared/tool-dispatch.js.map +1 -0
  459. package/dist/shared/types.js +1 -6
  460. package/dist/shared/types.js.map +1 -0
  461. package/dist/types/cli-highlight.d.js +2 -0
  462. package/dist/types/cli-highlight.d.js.map +1 -0
  463. package/dist/types/diff.d.js +2 -0
  464. package/dist/types/diff.d.js.map +1 -0
  465. package/dist/types/pdf-parse.d.js +2 -0
  466. package/dist/types/pdf-parse.d.js.map +1 -0
  467. package/dist/updater.d.ts +1 -1
  468. package/dist/updater.js +118 -92
  469. package/dist/updater.js.map +1 -0
  470. package/dist/webchat/widget.js +227 -380
  471. package/dist/webchat/widget.js.map +1 -0
  472. package/package.json +22 -10
  473. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  474. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  475. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  476. package/vendor/ink/build/apply-styles.js +175 -0
  477. package/vendor/ink/build/build-layout.js +77 -0
  478. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  479. package/vendor/ink/build/colorize.d.ts +3 -0
  480. package/vendor/ink/build/colorize.js +48 -0
  481. package/vendor/ink/build/colorize.js.map +1 -0
  482. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  483. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  484. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  485. package/vendor/ink/build/components/App.d.ts +18 -0
  486. package/vendor/ink/build/components/App.js +351 -0
  487. package/vendor/ink/build/components/App.js.map +1 -0
  488. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  489. package/vendor/ink/build/components/AppContext.js +11 -0
  490. package/vendor/ink/build/components/AppContext.js.map +1 -0
  491. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  492. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  493. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  494. package/vendor/ink/build/components/Box.d.ts +117 -0
  495. package/vendor/ink/build/components/Box.js +34 -0
  496. package/vendor/ink/build/components/Box.js.map +1 -0
  497. package/vendor/ink/build/components/Color.js +62 -0
  498. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  499. package/vendor/ink/build/components/Cursor.js +53 -0
  500. package/vendor/ink/build/components/Cursor.js.map +1 -0
  501. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  502. package/vendor/ink/build/components/CursorContext.js +8 -0
  503. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  504. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  505. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  506. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  507. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  508. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  509. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  510. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  511. package/vendor/ink/build/components/FocusContext.js +17 -0
  512. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  513. package/vendor/ink/build/components/Newline.d.ts +13 -0
  514. package/vendor/ink/build/components/Newline.js +8 -0
  515. package/vendor/ink/build/components/Newline.js.map +1 -0
  516. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  517. package/vendor/ink/build/components/Spacer.js +11 -0
  518. package/vendor/ink/build/components/Spacer.js.map +1 -0
  519. package/vendor/ink/build/components/Static.d.ts +24 -0
  520. package/vendor/ink/build/components/Static.js +28 -0
  521. package/vendor/ink/build/components/Static.js.map +1 -0
  522. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StderrContext.js +13 -0
  524. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  525. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  526. package/vendor/ink/build/components/StdinContext.js +19 -0
  527. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  528. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  529. package/vendor/ink/build/components/StdoutContext.js +13 -0
  530. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  531. package/vendor/ink/build/components/Text.d.ts +55 -0
  532. package/vendor/ink/build/components/Text.js +50 -0
  533. package/vendor/ink/build/components/Text.js.map +1 -0
  534. package/vendor/ink/build/components/Transform.d.ts +16 -0
  535. package/vendor/ink/build/components/Transform.js +15 -0
  536. package/vendor/ink/build/components/Transform.js.map +1 -0
  537. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  538. package/vendor/ink/build/cursor-helpers.js +56 -0
  539. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  540. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  541. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  542. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  543. package/vendor/ink/build/devtools.d.ts +1 -0
  544. package/vendor/ink/build/devtools.js +11 -0
  545. package/vendor/ink/build/devtools.js.map +1 -0
  546. package/vendor/ink/build/dom.d.ts +56 -0
  547. package/vendor/ink/build/dom.js +124 -0
  548. package/vendor/ink/build/dom.js.map +1 -0
  549. package/vendor/ink/build/experimental/apply-style.js +140 -0
  550. package/vendor/ink/build/experimental/dom.js +123 -0
  551. package/vendor/ink/build/experimental/output.js +91 -0
  552. package/vendor/ink/build/experimental/reconciler.js +141 -0
  553. package/vendor/ink/build/experimental/renderer.js +81 -0
  554. package/vendor/ink/build/get-max-width.d.ts +3 -0
  555. package/vendor/ink/build/get-max-width.js +10 -0
  556. package/vendor/ink/build/get-max-width.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  558. package/vendor/ink/build/hooks/use-app.js +8 -0
  559. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  561. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  562. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  564. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  565. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  567. package/vendor/ink/build/hooks/use-focus.js +42 -0
  568. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  570. package/vendor/ink/build/hooks/use-input.js +124 -0
  571. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  574. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  577. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  578. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  579. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  580. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  581. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  582. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  583. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  584. package/vendor/ink/build/hooks/useInput.js +38 -0
  585. package/vendor/ink/build/index.d.ts +34 -0
  586. package/vendor/ink/build/index.js +20 -0
  587. package/vendor/ink/build/index.js.map +1 -0
  588. package/vendor/ink/build/ink.d.ts +90 -0
  589. package/vendor/ink/build/ink.js +654 -0
  590. package/vendor/ink/build/ink.js.map +1 -0
  591. package/vendor/ink/build/input-parser.d.ts +7 -0
  592. package/vendor/ink/build/input-parser.js +154 -0
  593. package/vendor/ink/build/input-parser.js.map +1 -0
  594. package/vendor/ink/build/instance.js +205 -0
  595. package/vendor/ink/build/instances.d.ts +3 -0
  596. package/vendor/ink/build/instances.js +8 -0
  597. package/vendor/ink/build/instances.js.map +1 -0
  598. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  599. package/vendor/ink/build/kitty-keyboard.js +32 -0
  600. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  601. package/vendor/ink/build/layout.d.ts +7 -0
  602. package/vendor/ink/build/layout.js +33 -0
  603. package/vendor/ink/build/layout.js.map +1 -0
  604. package/vendor/ink/build/log-update.d.ts +19 -0
  605. package/vendor/ink/build/log-update.js +243 -0
  606. package/vendor/ink/build/log-update.js.map +1 -0
  607. package/vendor/ink/build/measure-element.d.ts +16 -0
  608. package/vendor/ink/build/measure-element.js +9 -0
  609. package/vendor/ink/build/measure-element.js.map +1 -0
  610. package/vendor/ink/build/measure-text.d.ts +6 -0
  611. package/vendor/ink/build/measure-text.js +21 -0
  612. package/vendor/ink/build/measure-text.js.map +1 -0
  613. package/vendor/ink/build/options.d.ts +52 -0
  614. package/vendor/ink/build/options.js +2 -0
  615. package/vendor/ink/build/options.js.map +1 -0
  616. package/vendor/ink/build/output.d.ts +35 -0
  617. package/vendor/ink/build/output.js +183 -0
  618. package/vendor/ink/build/output.js.map +1 -0
  619. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  620. package/vendor/ink/build/parse-keypress.js +493 -0
  621. package/vendor/ink/build/parse-keypress.js.map +1 -0
  622. package/vendor/ink/build/reconciler.d.ts +4 -0
  623. package/vendor/ink/build/reconciler.js +274 -0
  624. package/vendor/ink/build/reconciler.js.map +1 -0
  625. package/vendor/ink/build/render-background.d.ts +4 -0
  626. package/vendor/ink/build/render-background.js +25 -0
  627. package/vendor/ink/build/render-background.js.map +1 -0
  628. package/vendor/ink/build/render-border.d.ts +4 -0
  629. package/vendor/ink/build/render-border.js +73 -0
  630. package/vendor/ink/build/render-border.js.map +1 -0
  631. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  632. package/vendor/ink/build/render-node-to-output.js +147 -0
  633. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  634. package/vendor/ink/build/render-to-string.d.ts +38 -0
  635. package/vendor/ink/build/render-to-string.js +115 -0
  636. package/vendor/ink/build/render-to-string.js.map +1 -0
  637. package/vendor/ink/build/render.d.ts +121 -0
  638. package/vendor/ink/build/render.js +55 -0
  639. package/vendor/ink/build/render.js.map +1 -0
  640. package/vendor/ink/build/renderer.d.ts +8 -0
  641. package/vendor/ink/build/renderer.js +55 -0
  642. package/vendor/ink/build/renderer.js.map +1 -0
  643. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  644. package/vendor/ink/build/sanitize-ansi.js +27 -0
  645. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  646. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  647. package/vendor/ink/build/screen-reader-update.js +38 -0
  648. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  649. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  650. package/vendor/ink/build/squash-text-nodes.js +36 -0
  651. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  652. package/vendor/ink/build/styles.d.ts +240 -0
  653. package/vendor/ink/build/styles.js +232 -0
  654. package/vendor/ink/build/styles.js.map +1 -0
  655. package/vendor/ink/build/utils.d.ts +2 -0
  656. package/vendor/ink/build/utils.js +4 -0
  657. package/vendor/ink/build/utils.js.map +1 -0
  658. package/vendor/ink/build/wrap-text.d.ts +3 -0
  659. package/vendor/ink/build/wrap-text.js +31 -0
  660. package/vendor/ink/build/wrap-text.js.map +1 -0
  661. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  662. package/vendor/ink/build/write-synchronized.js +7 -0
  663. package/vendor/ink/build/write-synchronized.js.map +1 -0
  664. package/vendor/ink/license +10 -0
  665. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  666. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  667. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  668. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  669. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  670. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  671. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  672. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  673. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  674. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  675. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  676. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  677. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  678. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  679. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  680. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  681. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  682. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  683. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  684. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  685. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  686. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  687. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  688. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  689. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  690. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  691. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  692. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  693. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  694. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  695. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  696. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  697. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  698. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  699. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  700. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  701. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  702. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  703. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  704. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  705. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  706. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  707. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  708. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  709. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  710. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  711. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  712. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  713. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  714. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  715. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  716. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  717. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  718. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  719. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  720. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  721. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  722. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  723. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  724. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  725. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  726. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  727. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  728. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  729. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  730. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  731. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  732. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  733. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  734. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  735. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  746. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  747. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  748. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  749. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  750. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  751. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  752. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  753. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  754. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  755. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  756. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  757. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  758. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  759. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  760. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  761. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  762. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  763. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  764. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  765. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  766. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  767. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  768. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  769. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  770. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  784. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  785. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  786. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  787. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  788. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  789. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  790. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  791. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  792. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  793. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  794. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  795. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  796. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  797. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  798. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  799. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  800. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  801. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  802. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  803. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  804. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  805. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  806. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  807. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  808. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  809. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  810. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  811. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  812. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  813. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  814. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  815. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  816. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  817. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  818. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  819. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  820. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  821. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  822. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  823. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  824. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  825. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  826. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  827. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  828. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  829. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  830. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  831. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  832. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  833. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  834. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  835. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  836. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  837. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  838. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  839. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  840. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  841. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  842. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  843. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  844. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  845. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  846. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  847. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  848. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  849. package/vendor/ink/package.json +201 -0
  850. package/vendor/ink/readme.md +2636 -0
  851. package/bin/swag-agent.js +0 -9
  852. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  853. package/dist/server/lib/pg-rate-limiter.js +0 -86
@@ -1,394 +1,564 @@
1
1
  // server/handlers/llm-providers.ts — Multi-provider LLM with automatic failover
2
2
  // Providers: Anthropic, OpenAI, Google, AWS Bedrock, Ollama (local)
3
+
3
4
  import Anthropic from "@anthropic-ai/sdk";
4
5
  import OpenAI from "openai";
5
6
  import { GoogleGenAI } from "@google/genai";
6
7
  import { BedrockRuntimeClient, InvokeModelCommand } from "@aws-sdk/client-bedrock-runtime";
7
8
  import { MODELS } from "../../shared/constants.js";
9
+
10
+ // ============================================================================
11
+ // TYPES
12
+ // ============================================================================
13
+
8
14
  // ============================================================================
9
15
  // STATIC MODEL LISTS
10
16
  // ============================================================================
11
- const ANTHROPIC_MODELS = [
12
- { model_id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", context_window: 200000 },
13
- { model_id: "claude-opus-4-6", name: "Claude Opus 4.6", context_window: 200000 },
14
- { model_id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", context_window: 200000 },
15
- { model_id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4", context_window: 200000 },
16
- { model_id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", context_window: 200000 },
17
- { model_id: "claude-3-5-sonnet-20241022", name: "Claude 3.5 Sonnet", context_window: 200000 },
18
- ];
19
- const OPENAI_MODELS = [
20
- { model_id: "gpt-4o", name: "GPT-4o", context_window: 128000 },
21
- { model_id: "gpt-4o-mini", name: "GPT-4o Mini", context_window: 128000 },
22
- { model_id: "gpt-4-turbo", name: "GPT-4 Turbo", context_window: 128000 },
23
- { model_id: "o1", name: "o1", context_window: 200000 },
24
- { model_id: "o1-mini", name: "o1-mini", context_window: 128000 },
25
- { model_id: "o3-mini", name: "o3-mini", context_window: 200000 },
26
- ];
27
- const BEDROCK_MODELS = [
28
- { model_id: "anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Bedrock)", context_window: 200000 },
29
- { model_id: "us.anthropic.claude-sonnet-4-20250514-v1:0", name: "Claude Sonnet 4 (Bedrock)", context_window: 200000 },
30
- { model_id: "us.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (Bedrock)", context_window: 200000 },
31
- { model_id: "us.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (Bedrock)", context_window: 200000 },
32
- { model_id: "us.anthropic.claude-3-5-haiku-20241022-v1:0", name: "Claude 3.5 Haiku (Bedrock)", context_window: 200000 },
33
- { model_id: "us.meta.llama3-1-70b-instruct-v1:0", name: "Llama 3.1 70B (Bedrock)", context_window: 128000 },
34
- { model_id: "us.amazon.nova-pro-v1:0", name: "Amazon Nova Pro (Bedrock)", context_window: 300000 },
35
- ];
36
- const GOOGLE_MODELS = [
37
- { model_id: "gemini-3-pro-preview", name: "Gemini 3 Pro", context_window: 1048576 },
38
- { model_id: "gemini-3-flash-preview", name: "Gemini 3 Flash", context_window: 1048576 },
39
- { model_id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", context_window: 1048576 },
40
- { model_id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", context_window: 1048576 },
41
- { model_id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", context_window: 1048576 },
42
- { model_id: "gemini-2.0-flash", name: "Gemini 2.0 Flash", context_window: 1048576 },
43
- { model_id: "gemini-2.0-flash-lite", name: "Gemini 2.0 Flash Lite", context_window: 1048576 },
44
- ];
45
- const OLLAMA_MODELS = [
46
- { model_id: "llama3.2", name: "Llama 3.2 (local)", context_window: 128000 },
47
- { model_id: "mistral", name: "Mistral (local)", context_window: 32000 },
48
- { model_id: "codellama", name: "Code Llama (local)", context_window: 16000 },
49
- { model_id: "phi3", name: "Phi-3 (local)", context_window: 128000 },
50
- ];
17
+
18
+ const ANTHROPIC_MODELS = [{
19
+ model_id: "claude-sonnet-4-6",
20
+ name: "Claude Sonnet 4.6",
21
+ context_window: 200000
22
+ }, {
23
+ model_id: "claude-opus-4-6",
24
+ name: "Claude Opus 4.6",
25
+ context_window: 200000
26
+ }, {
27
+ model_id: "claude-sonnet-4-5-20250929",
28
+ name: "Claude Sonnet 4.5",
29
+ context_window: 200000
30
+ }, {
31
+ model_id: "claude-sonnet-4-20250514",
32
+ name: "Claude Sonnet 4",
33
+ context_window: 200000
34
+ }, {
35
+ model_id: "claude-haiku-4-5-20251001",
36
+ name: "Claude Haiku 4.5",
37
+ context_window: 200000
38
+ }, {
39
+ model_id: "claude-3-5-sonnet-20241022",
40
+ name: "Claude 3.5 Sonnet",
41
+ context_window: 200000
42
+ }];
43
+ const OPENAI_MODELS = [{
44
+ model_id: "gpt-4o",
45
+ name: "GPT-4o",
46
+ context_window: 128000
47
+ }, {
48
+ model_id: "gpt-4o-mini",
49
+ name: "GPT-4o Mini",
50
+ context_window: 128000
51
+ }, {
52
+ model_id: "gpt-4-turbo",
53
+ name: "GPT-4 Turbo",
54
+ context_window: 128000
55
+ }, {
56
+ model_id: "o1",
57
+ name: "o1",
58
+ context_window: 200000
59
+ }, {
60
+ model_id: "o1-mini",
61
+ name: "o1-mini",
62
+ context_window: 128000
63
+ }, {
64
+ model_id: "o3-mini",
65
+ name: "o3-mini",
66
+ context_window: 200000
67
+ }];
68
+ const BEDROCK_MODELS = [{
69
+ model_id: "anthropic.claude-sonnet-4-6",
70
+ name: "Claude Sonnet 4.6 (Bedrock)",
71
+ context_window: 200000
72
+ }, {
73
+ model_id: "us.anthropic.claude-sonnet-4-20250514-v1:0",
74
+ name: "Claude Sonnet 4 (Bedrock)",
75
+ context_window: 200000
76
+ }, {
77
+ model_id: "us.anthropic.claude-sonnet-4-5-20250929-v1:0",
78
+ name: "Claude Sonnet 4.5 (Bedrock)",
79
+ context_window: 200000
80
+ }, {
81
+ model_id: "us.anthropic.claude-haiku-4-5-20251001-v1:0",
82
+ name: "Claude Haiku 4.5 (Bedrock)",
83
+ context_window: 200000
84
+ }, {
85
+ model_id: "us.anthropic.claude-3-5-haiku-20241022-v1:0",
86
+ name: "Claude 3.5 Haiku (Bedrock)",
87
+ context_window: 200000
88
+ }, {
89
+ model_id: "us.meta.llama3-1-70b-instruct-v1:0",
90
+ name: "Llama 3.1 70B (Bedrock)",
91
+ context_window: 128000
92
+ }, {
93
+ model_id: "us.amazon.nova-pro-v1:0",
94
+ name: "Amazon Nova Pro (Bedrock)",
95
+ context_window: 300000
96
+ }];
97
+ const GOOGLE_MODELS = [{
98
+ model_id: "gemini-3-pro-preview",
99
+ name: "Gemini 3 Pro",
100
+ context_window: 1048576
101
+ }, {
102
+ model_id: "gemini-3-flash-preview",
103
+ name: "Gemini 3 Flash",
104
+ context_window: 1048576
105
+ }, {
106
+ model_id: "gemini-2.5-pro",
107
+ name: "Gemini 2.5 Pro",
108
+ context_window: 1048576
109
+ }, {
110
+ model_id: "gemini-2.5-flash",
111
+ name: "Gemini 2.5 Flash",
112
+ context_window: 1048576
113
+ }, {
114
+ model_id: "gemini-2.5-flash-lite",
115
+ name: "Gemini 2.5 Flash Lite",
116
+ context_window: 1048576
117
+ }, {
118
+ model_id: "gemini-2.0-flash",
119
+ name: "Gemini 2.0 Flash",
120
+ context_window: 1048576
121
+ }, {
122
+ model_id: "gemini-2.0-flash-lite",
123
+ name: "Gemini 2.0 Flash Lite",
124
+ context_window: 1048576
125
+ }];
126
+ const OLLAMA_MODELS = [{
127
+ model_id: "llama3.2",
128
+ name: "Llama 3.2 (local)",
129
+ context_window: 128000
130
+ }, {
131
+ model_id: "mistral",
132
+ name: "Mistral (local)",
133
+ context_window: 32000
134
+ }, {
135
+ model_id: "codellama",
136
+ name: "Code Llama (local)",
137
+ context_window: 16000
138
+ }, {
139
+ model_id: "phi3",
140
+ name: "Phi-3 (local)",
141
+ context_window: 128000
142
+ }];
143
+
51
144
  // ============================================================================
52
145
  // CLIENT CACHE — reuse SDK clients to leverage internal connection pooling
53
146
  // ============================================================================
147
+
54
148
  const clientCache = new Map();
55
149
  const CLIENT_CACHE_TTL = 300_000; // 5 minutes
150
+
56
151
  function getCachedClient(provider, apiKey, createFn) {
57
- const key = `${provider}:${apiKey.slice(-8)}`;
58
- const cached = clientCache.get(key);
59
- if (cached && Date.now() - cached.createdAt < CLIENT_CACHE_TTL)
60
- return cached.client;
61
- const client = createFn();
62
- clientCache.set(key, { client, createdAt: Date.now() });
63
- // LRU eviction: drop oldest entry if cache grows too large
64
- if (clientCache.size > 20) {
65
- const oldest = clientCache.keys().next().value;
66
- if (oldest)
67
- clientCache.delete(oldest);
68
- }
69
- return client;
152
+ const key = `${provider}:${apiKey.slice(-8)}`;
153
+ const cached = clientCache.get(key);
154
+ if (cached && Date.now() - cached.createdAt < CLIENT_CACHE_TTL) return cached.client;
155
+ const client = createFn();
156
+ clientCache.set(key, {
157
+ client,
158
+ createdAt: Date.now()
159
+ });
160
+ // LRU eviction: drop oldest entry if cache grows too large
161
+ if (clientCache.size > 20) {
162
+ const oldest = clientCache.keys().next().value;
163
+ if (oldest) clientCache.delete(oldest);
164
+ }
165
+ return client;
70
166
  }
167
+
71
168
  // ============================================================================
72
169
  // CREDENTIAL CACHE — avoid repeated DB round-trips for the same store
73
170
  // ============================================================================
171
+
74
172
  const credentialCache = new Map();
75
173
  const CREDENTIAL_CACHE_TTL = 60_000; // 1 minute
174
+
76
175
  // ============================================================================
77
176
  // CREDENTIAL RESOLUTION
78
177
  // ============================================================================
178
+
79
179
  async function getCredentials(sb, storeId) {
80
- // Check credential cache first
81
- const cacheKey = `creds:${storeId}`;
82
- const cached = credentialCache.get(cacheKey);
83
- if (cached && Date.now() < cached.expiresAt)
84
- return cached.data;
85
- const creds = await _fetchCredentials(sb, storeId);
86
- // Cache for CREDENTIAL_CACHE_TTL
87
- credentialCache.set(cacheKey, { data: creds, expiresAt: Date.now() + CREDENTIAL_CACHE_TTL });
88
- // LRU eviction: drop oldest entry if cache grows too large
89
- if (credentialCache.size > 50) {
90
- const oldest = credentialCache.keys().next().value;
91
- if (oldest)
92
- credentialCache.delete(oldest);
93
- }
94
- return creds;
180
+ // Check credential cache first
181
+ const cacheKey = `creds:${storeId}`;
182
+ const cached = credentialCache.get(cacheKey);
183
+ if (cached && Date.now() < cached.expiresAt) return cached.data;
184
+ const creds = await _fetchCredentials(sb, storeId);
185
+
186
+ // Cache for CREDENTIAL_CACHE_TTL
187
+ credentialCache.set(cacheKey, {
188
+ data: creds,
189
+ expiresAt: Date.now() + CREDENTIAL_CACHE_TTL
190
+ });
191
+ // LRU eviction: drop oldest entry if cache grows too large
192
+ if (credentialCache.size > 50) {
193
+ const oldest = credentialCache.keys().next().value;
194
+ if (oldest) credentialCache.delete(oldest);
195
+ }
196
+ return creds;
95
197
  }
96
198
  async function _fetchCredentials(sb, storeId) {
97
- const creds = {};
98
- // Anthropic — available via process.env on the server
99
- const anthropicKey = process.env.ANTHROPIC_API_KEY;
100
- if (anthropicKey) {
101
- creds.anthropic = { apiKey: anthropicKey };
199
+ const creds = {};
200
+
201
+ // Anthropic available via process.env on the server
202
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
203
+ if (anthropicKey) {
204
+ creds.anthropic = {
205
+ apiKey: anthropicKey
206
+ };
207
+ }
208
+
209
+ // OpenAI — from user_tool_secrets (encrypted)
210
+ try {
211
+ const {
212
+ data: openaiKey
213
+ } = await sb.rpc("decrypt_secret", {
214
+ p_name: "OPENAI_API_KEY",
215
+ p_store_id: storeId
216
+ });
217
+ if (openaiKey) {
218
+ creds.openai = {
219
+ apiKey: openaiKey
220
+ };
102
221
  }
103
- // OpenAI from user_tool_secrets (encrypted)
104
- try {
105
- const { data: openaiKey } = await sb.rpc("decrypt_secret", { p_name: "OPENAI_API_KEY", p_store_id: storeId });
106
- if (openaiKey) {
107
- creds.openai = { apiKey: openaiKey };
108
- }
222
+ } catch {/* not configured */}
223
+
224
+ // Google AI from user_tool_secrets (encrypted)
225
+ try {
226
+ const {
227
+ data: googleKey
228
+ } = await sb.rpc("decrypt_secret", {
229
+ p_name: "GOOGLE_AI_API_KEY",
230
+ p_store_id: storeId
231
+ });
232
+ if (googleKey) {
233
+ creds.google = {
234
+ apiKey: googleKey
235
+ };
109
236
  }
110
- catch { /* not configured */ }
111
- // Google AI — from user_tool_secrets (encrypted)
112
- try {
113
- const { data: googleKey } = await sb.rpc("decrypt_secret", { p_name: "GOOGLE_AI_API_KEY", p_store_id: storeId });
114
- if (googleKey) {
115
- creds.google = { apiKey: googleKey };
116
- }
237
+ } catch {/* not configured */}
238
+
239
+ // AWS Bedrock — from user_tool_secrets
240
+ try {
241
+ const [accessKeyRes, secretKeyRes, regionRes] = await Promise.all([sb.rpc("decrypt_secret", {
242
+ p_name: "AWS_ACCESS_KEY_ID",
243
+ p_store_id: storeId
244
+ }), sb.rpc("decrypt_secret", {
245
+ p_name: "AWS_SECRET_ACCESS_KEY",
246
+ p_store_id: storeId
247
+ }), sb.rpc("decrypt_secret", {
248
+ p_name: "AWS_REGION",
249
+ p_store_id: storeId
250
+ })]);
251
+ if (accessKeyRes.data && secretKeyRes.data) {
252
+ creds.bedrock = {
253
+ accessKeyId: accessKeyRes.data,
254
+ secretAccessKey: secretKeyRes.data,
255
+ region: regionRes.data || "us-east-1"
256
+ };
117
257
  }
118
- catch { /* not configured */ }
119
- // AWS Bedrock — from user_tool_secrets
258
+ } catch {/* not configured */}
259
+
260
+ // P1 FIX: Only check Ollama when explicitly enabled (saves +2s on every credential load in prod)
261
+ if (process.env.OLLAMA_ENABLED === "true") {
120
262
  try {
121
- const [accessKeyRes, secretKeyRes, regionRes] = await Promise.all([
122
- sb.rpc("decrypt_secret", { p_name: "AWS_ACCESS_KEY_ID", p_store_id: storeId }),
123
- sb.rpc("decrypt_secret", { p_name: "AWS_SECRET_ACCESS_KEY", p_store_id: storeId }),
124
- sb.rpc("decrypt_secret", { p_name: "AWS_REGION", p_store_id: storeId }),
125
- ]);
126
- if (accessKeyRes.data && secretKeyRes.data) {
127
- creds.bedrock = {
128
- accessKeyId: accessKeyRes.data,
129
- secretAccessKey: secretKeyRes.data,
130
- region: regionRes.data || "us-east-1",
131
- };
132
- }
133
- }
134
- catch { /* not configured */ }
135
- // P1 FIX: Only check Ollama when explicitly enabled (saves +2s on every credential load in prod)
136
- if (process.env.OLLAMA_ENABLED === "true") {
137
- try {
138
- const controller = new AbortController();
139
- const timer = setTimeout(() => controller.abort(), 2000);
140
- const resp = await fetch("http://localhost:11434/api/version", { signal: controller.signal });
141
- clearTimeout(timer);
142
- if (resp.ok) {
143
- creds.ollama = { available: true };
144
- }
145
- }
146
- catch { /* not available */ }
147
- }
148
- return creds;
263
+ const controller = new AbortController();
264
+ const timer = setTimeout(() => controller.abort(), 2000);
265
+ const resp = await fetch("http://localhost:11434/api/version", {
266
+ signal: controller.signal
267
+ });
268
+ clearTimeout(timer);
269
+ if (resp.ok) {
270
+ creds.ollama = {
271
+ available: true
272
+ };
273
+ }
274
+ } catch {/* not available */}
275
+ }
276
+ return creds;
149
277
  }
278
+
150
279
  // ============================================================================
151
280
  // PROVIDER IMPLEMENTATIONS
152
281
  // ============================================================================
282
+
153
283
  const PROVIDER_TIMEOUT_MS = 120_000;
154
284
  async function callAnthropic(apiKey, prompt, model, maxTokens, temperature, systemPrompt) {
155
- const client = getCachedClient("anthropic", apiKey, () => new Anthropic({ apiKey }));
156
- const selectedModel = model || MODELS.SONNET;
157
- const controller = new AbortController();
158
- const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
159
- try {
160
- const resp = await client.messages.create({
161
- model: selectedModel,
162
- max_tokens: maxTokens,
163
- temperature,
164
- ...(systemPrompt ? { system: systemPrompt } : {}),
165
- messages: [{ role: "user", content: prompt }],
166
- }, { signal: controller.signal });
167
- clearTimeout(timer);
168
- const text = resp.content
169
- .filter((b) => b.type === "text")
170
- .map((b) => b.text)
171
- .join("\n");
172
- return {
173
- provider: "anthropic",
174
- model: selectedModel,
175
- text,
176
- tokens: {
177
- input: resp.usage.input_tokens,
178
- output: resp.usage.output_tokens,
179
- },
180
- };
181
- }
182
- catch (err) {
183
- clearTimeout(timer);
184
- throw err;
185
- }
285
+ const client = getCachedClient("anthropic", apiKey, () => new Anthropic({
286
+ apiKey
287
+ }));
288
+ const selectedModel = model || MODELS.SONNET;
289
+ const controller = new AbortController();
290
+ const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
291
+ try {
292
+ const resp = await client.messages.create({
293
+ model: selectedModel,
294
+ max_tokens: maxTokens,
295
+ temperature,
296
+ ...(systemPrompt ? {
297
+ system: systemPrompt
298
+ } : {}),
299
+ messages: [{
300
+ role: "user",
301
+ content: prompt
302
+ }]
303
+ }, {
304
+ signal: controller.signal
305
+ });
306
+ clearTimeout(timer);
307
+ const text = resp.content.filter(b => b.type === "text").map(b => b.text).join("\n");
308
+ return {
309
+ provider: "anthropic",
310
+ model: selectedModel,
311
+ text,
312
+ tokens: {
313
+ input: resp.usage.input_tokens,
314
+ output: resp.usage.output_tokens
315
+ }
316
+ };
317
+ } catch (err) {
318
+ clearTimeout(timer);
319
+ throw err;
320
+ }
186
321
  }
187
322
  async function callOpenAI(apiKey, prompt, model, maxTokens, temperature, systemPrompt) {
188
- const client = getCachedClient("openai", apiKey, () => new OpenAI({ apiKey }));
189
- const selectedModel = model || "gpt-4o";
190
- const controller = new AbortController();
191
- const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
192
- try {
193
- const messages = [];
194
- if (systemPrompt) {
195
- messages.push({ role: "system", content: systemPrompt });
196
- }
197
- messages.push({ role: "user", content: prompt });
198
- const resp = await client.chat.completions.create({
199
- model: selectedModel,
200
- max_tokens: maxTokens,
201
- temperature,
202
- messages,
203
- }, { signal: controller.signal });
204
- clearTimeout(timer);
205
- const text = resp.choices[0]?.message?.content || "";
206
- return {
207
- provider: "openai",
208
- model: selectedModel,
209
- text,
210
- tokens: {
211
- input: resp.usage?.prompt_tokens || 0,
212
- output: resp.usage?.completion_tokens || 0,
213
- },
214
- };
215
- }
216
- catch (err) {
217
- clearTimeout(timer);
218
- throw err;
323
+ const client = getCachedClient("openai", apiKey, () => new OpenAI({
324
+ apiKey
325
+ }));
326
+ const selectedModel = model || "gpt-4o";
327
+ const controller = new AbortController();
328
+ const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
329
+ try {
330
+ const messages = [];
331
+ if (systemPrompt) {
332
+ messages.push({
333
+ role: "system",
334
+ content: systemPrompt
335
+ });
219
336
  }
337
+ messages.push({
338
+ role: "user",
339
+ content: prompt
340
+ });
341
+ const resp = await client.chat.completions.create({
342
+ model: selectedModel,
343
+ max_tokens: maxTokens,
344
+ temperature,
345
+ messages
346
+ }, {
347
+ signal: controller.signal
348
+ });
349
+ clearTimeout(timer);
350
+ const text = resp.choices[0]?.message?.content || "";
351
+ return {
352
+ provider: "openai",
353
+ model: selectedModel,
354
+ text,
355
+ tokens: {
356
+ input: resp.usage?.prompt_tokens || 0,
357
+ output: resp.usage?.completion_tokens || 0
358
+ }
359
+ };
360
+ } catch (err) {
361
+ clearTimeout(timer);
362
+ throw err;
363
+ }
220
364
  }
221
365
  async function callGoogle(apiKey, prompt, model, maxTokens, temperature, systemPrompt) {
222
- const client = getCachedClient("google", apiKey, () => new GoogleGenAI({ apiKey }));
223
- const selectedModel = model || "gemini-2.5-flash";
224
- // Thinking models (Pro/2.5+) use thinking tokens that count against maxOutputTokens.
225
- // Enforce a minimum of 2048 so thinking doesn't consume the entire budget.
226
- const isThinkingModel = /pro|2\.5|3-/.test(selectedModel);
227
- const effectiveMaxTokens = isThinkingModel ? Math.max(maxTokens, 2048) : maxTokens;
228
- const controller = new AbortController();
229
- const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
230
- try {
231
- const response = await client.models.generateContent({
232
- model: selectedModel,
233
- contents: prompt,
234
- config: {
235
- maxOutputTokens: effectiveMaxTokens,
236
- temperature,
237
- ...(systemPrompt ? { systemInstruction: systemPrompt } : {}),
238
- abortSignal: controller.signal,
239
- },
240
- });
241
- clearTimeout(timer);
242
- const text = response.text ?? "";
243
- const usage = response.usageMetadata;
244
- return {
245
- provider: "google",
246
- model: selectedModel,
247
- text,
248
- tokens: {
249
- input: usage?.promptTokenCount || 0,
250
- output: usage?.candidatesTokenCount || 0,
251
- },
252
- };
253
- }
254
- catch (err) {
255
- clearTimeout(timer);
256
- throw err;
257
- }
366
+ const client = getCachedClient("google", apiKey, () => new GoogleGenAI({
367
+ apiKey
368
+ }));
369
+ const selectedModel = model || "gemini-2.5-flash";
370
+
371
+ // Thinking models (Pro/2.5+) use thinking tokens that count against maxOutputTokens.
372
+ // Enforce a minimum of 2048 so thinking doesn't consume the entire budget.
373
+ const isThinkingModel = /pro|2\.5|3-/.test(selectedModel);
374
+ const effectiveMaxTokens = isThinkingModel ? Math.max(maxTokens, 2048) : maxTokens;
375
+ const controller = new AbortController();
376
+ const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
377
+ try {
378
+ const response = await client.models.generateContent({
379
+ model: selectedModel,
380
+ contents: prompt,
381
+ config: {
382
+ maxOutputTokens: effectiveMaxTokens,
383
+ temperature,
384
+ ...(systemPrompt ? {
385
+ systemInstruction: systemPrompt
386
+ } : {}),
387
+ abortSignal: controller.signal
388
+ }
389
+ });
390
+ clearTimeout(timer);
391
+ const text = response.text ?? "";
392
+ const usage = response.usageMetadata;
393
+ return {
394
+ provider: "google",
395
+ model: selectedModel,
396
+ text,
397
+ tokens: {
398
+ input: usage?.promptTokenCount || 0,
399
+ output: usage?.candidatesTokenCount || 0
400
+ }
401
+ };
402
+ } catch (err) {
403
+ clearTimeout(timer);
404
+ throw err;
405
+ }
258
406
  }
259
407
  async function callBedrock(accessKeyId, secretAccessKey, region, prompt, model, maxTokens, temperature, systemPrompt) {
260
- const client = getCachedClient(`bedrock:${region || "us-east-1"}`, accessKeyId, () => new BedrockRuntimeClient({
261
- region: region || "us-east-1",
262
- credentials: { accessKeyId, secretAccessKey },
263
- }));
264
- const selectedModel = model || "us.anthropic.claude-3-5-haiku-20241022-v1:0";
265
- // P1 FIX: Detect model family and format body accordingly
266
- const isAnthropicModel = /anthropic|claude/i.test(selectedModel);
267
- const isTitanModel = /titan/i.test(selectedModel);
268
- const isLlama = /llama|meta/i.test(selectedModel);
269
- const isMistral = /mistral/i.test(selectedModel);
270
- let body;
271
- if (isAnthropicModel) {
272
- body = JSON.stringify({
273
- anthropic_version: "bedrock-2023-05-31",
274
- max_tokens: maxTokens,
275
- temperature,
276
- ...(systemPrompt ? { system: systemPrompt } : {}),
277
- messages: [{ role: "user", content: prompt }],
278
- });
279
- }
280
- else if (isTitanModel) {
281
- body = JSON.stringify({
282
- inputText: systemPrompt ? `${systemPrompt}\n\n${prompt}` : prompt,
283
- textGenerationConfig: { maxTokenCount: maxTokens, temperature },
284
- });
285
- }
286
- else if (isLlama || isMistral) {
287
- body = JSON.stringify({
288
- prompt: systemPrompt ? `<s>[INST] ${systemPrompt}\n\n${prompt} [/INST]` : `<s>[INST] ${prompt} [/INST]`,
289
- max_gen_len: maxTokens,
290
- temperature,
291
- });
408
+ const client = getCachedClient(`bedrock:${region || "us-east-1"}`, accessKeyId, () => new BedrockRuntimeClient({
409
+ region: region || "us-east-1",
410
+ credentials: {
411
+ accessKeyId,
412
+ secretAccessKey
292
413
  }
293
- else {
294
- console.warn(`[bedrock] Unknown model family for "${selectedModel}", defaulting to Anthropic format`);
295
- body = JSON.stringify({
296
- anthropic_version: "bedrock-2023-05-31",
297
- max_tokens: maxTokens,
298
- temperature,
299
- ...(systemPrompt ? { system: systemPrompt } : {}),
300
- messages: [{ role: "user", content: prompt }],
301
- });
302
- }
303
- const command = new InvokeModelCommand({
304
- modelId: selectedModel,
305
- contentType: "application/json",
306
- accept: "application/json",
307
- body: new TextEncoder().encode(body),
414
+ }));
415
+ const selectedModel = model || "us.anthropic.claude-3-5-haiku-20241022-v1:0";
416
+
417
+ // P1 FIX: Detect model family and format body accordingly
418
+ const isAnthropicModel = /anthropic|claude/i.test(selectedModel);
419
+ const isTitanModel = /titan/i.test(selectedModel);
420
+ const isLlama = /llama|meta/i.test(selectedModel);
421
+ const isMistral = /mistral/i.test(selectedModel);
422
+ let body;
423
+ if (isAnthropicModel) {
424
+ body = JSON.stringify({
425
+ anthropic_version: "bedrock-2023-05-31",
426
+ max_tokens: maxTokens,
427
+ temperature,
428
+ ...(systemPrompt ? {
429
+ system: systemPrompt
430
+ } : {}),
431
+ messages: [{
432
+ role: "user",
433
+ content: prompt
434
+ }]
308
435
  });
309
- // AbortController for timeout
310
- const controller = new AbortController();
311
- const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
312
- try {
313
- const resp = await client.send(command, { abortSignal: controller.signal });
314
- clearTimeout(timer);
315
- const respBody = JSON.parse(new TextDecoder().decode(resp.body));
316
- // P1 FIX: Parse response based on model family
317
- let text;
318
- let inputTokens;
319
- let outputTokens;
320
- if (isAnthropicModel) {
321
- text = respBody.content?.[0]?.text || "";
322
- inputTokens = respBody.usage?.input_tokens || 0;
323
- outputTokens = respBody.usage?.output_tokens || 0;
324
- }
325
- else if (isTitanModel) {
326
- text = respBody.results?.[0]?.outputText || "";
327
- inputTokens = respBody.inputTextTokenCount || 0;
328
- outputTokens = respBody.results?.[0]?.tokenCount || 0;
329
- }
330
- else if (isLlama || isMistral) {
331
- text = respBody.generation || "";
332
- inputTokens = respBody.prompt_token_count || 0;
333
- outputTokens = respBody.generation_token_count || 0;
334
- }
335
- else {
336
- text = respBody.content?.[0]?.text || respBody.generation || respBody.results?.[0]?.outputText || "";
337
- inputTokens = respBody.usage?.input_tokens || 0;
338
- outputTokens = respBody.usage?.output_tokens || 0;
339
- }
340
- return {
341
- provider: "bedrock",
342
- model: selectedModel,
343
- text,
344
- tokens: { input: inputTokens, output: outputTokens },
345
- };
346
- }
347
- catch (err) {
348
- clearTimeout(timer);
349
- throw err;
436
+ } else if (isTitanModel) {
437
+ body = JSON.stringify({
438
+ inputText: systemPrompt ? `${systemPrompt}\n\n${prompt}` : prompt,
439
+ textGenerationConfig: {
440
+ maxTokenCount: maxTokens,
441
+ temperature
442
+ }
443
+ });
444
+ } else if (isLlama || isMistral) {
445
+ body = JSON.stringify({
446
+ prompt: systemPrompt ? `<s>[INST] ${systemPrompt}\n\n${prompt} [/INST]` : `<s>[INST] ${prompt} [/INST]`,
447
+ max_gen_len: maxTokens,
448
+ temperature
449
+ });
450
+ } else {
451
+ console.warn(`[bedrock] Unknown model family for "${selectedModel}", defaulting to Anthropic format`);
452
+ body = JSON.stringify({
453
+ anthropic_version: "bedrock-2023-05-31",
454
+ max_tokens: maxTokens,
455
+ temperature,
456
+ ...(systemPrompt ? {
457
+ system: systemPrompt
458
+ } : {}),
459
+ messages: [{
460
+ role: "user",
461
+ content: prompt
462
+ }]
463
+ });
464
+ }
465
+ const command = new InvokeModelCommand({
466
+ modelId: selectedModel,
467
+ contentType: "application/json",
468
+ accept: "application/json",
469
+ body: new TextEncoder().encode(body)
470
+ });
471
+
472
+ // AbortController for timeout
473
+ const controller = new AbortController();
474
+ const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
475
+ try {
476
+ const resp = await client.send(command, {
477
+ abortSignal: controller.signal
478
+ });
479
+ clearTimeout(timer);
480
+ const respBody = JSON.parse(new TextDecoder().decode(resp.body));
481
+
482
+ // P1 FIX: Parse response based on model family
483
+ let text;
484
+ let inputTokens;
485
+ let outputTokens;
486
+ if (isAnthropicModel) {
487
+ text = respBody.content?.[0]?.text || "";
488
+ inputTokens = respBody.usage?.input_tokens || 0;
489
+ outputTokens = respBody.usage?.output_tokens || 0;
490
+ } else if (isTitanModel) {
491
+ text = respBody.results?.[0]?.outputText || "";
492
+ inputTokens = respBody.inputTextTokenCount || 0;
493
+ outputTokens = respBody.results?.[0]?.tokenCount || 0;
494
+ } else if (isLlama || isMistral) {
495
+ text = respBody.generation || "";
496
+ inputTokens = respBody.prompt_token_count || 0;
497
+ outputTokens = respBody.generation_token_count || 0;
498
+ } else {
499
+ text = respBody.content?.[0]?.text || respBody.generation || respBody.results?.[0]?.outputText || "";
500
+ inputTokens = respBody.usage?.input_tokens || 0;
501
+ outputTokens = respBody.usage?.output_tokens || 0;
350
502
  }
503
+ return {
504
+ provider: "bedrock",
505
+ model: selectedModel,
506
+ text,
507
+ tokens: {
508
+ input: inputTokens,
509
+ output: outputTokens
510
+ }
511
+ };
512
+ } catch (err) {
513
+ clearTimeout(timer);
514
+ throw err;
515
+ }
351
516
  }
352
517
  async function callOllama(prompt, model, systemPrompt) {
353
- const selectedModel = model || "llama3.2";
354
- const controller = new AbortController();
355
- const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
356
- try {
357
- const resp = await fetch("http://localhost:11434/api/generate", {
358
- method: "POST",
359
- headers: { "Content-Type": "application/json" },
360
- body: JSON.stringify({
361
- model: selectedModel,
362
- prompt,
363
- ...(systemPrompt ? { system: systemPrompt } : {}),
364
- stream: false,
365
- }),
366
- signal: controller.signal,
367
- });
368
- clearTimeout(timer);
369
- if (!resp.ok) {
370
- const errText = await resp.text();
371
- throw new Error(`Ollama HTTP ${resp.status}: ${errText.substring(0, 200)}`);
372
- }
373
- const data = await resp.json();
374
- return {
375
- provider: "ollama",
376
- model: selectedModel,
377
- text: data.response || "",
378
- tokens: {
379
- input: data.prompt_eval_count || 0,
380
- output: data.eval_count || 0,
381
- },
382
- };
383
- }
384
- catch (err) {
385
- clearTimeout(timer);
386
- throw err;
518
+ const selectedModel = model || "llama3.2";
519
+ const controller = new AbortController();
520
+ const timer = setTimeout(() => controller.abort(), PROVIDER_TIMEOUT_MS);
521
+ try {
522
+ const resp = await fetch("http://localhost:11434/api/generate", {
523
+ method: "POST",
524
+ headers: {
525
+ "Content-Type": "application/json"
526
+ },
527
+ body: JSON.stringify({
528
+ model: selectedModel,
529
+ prompt,
530
+ ...(systemPrompt ? {
531
+ system: systemPrompt
532
+ } : {}),
533
+ stream: false
534
+ }),
535
+ signal: controller.signal
536
+ });
537
+ clearTimeout(timer);
538
+ if (!resp.ok) {
539
+ const errText = await resp.text();
540
+ throw new Error(`Ollama HTTP ${resp.status}: ${errText.substring(0, 200)}`);
387
541
  }
542
+ const data = await resp.json();
543
+ return {
544
+ provider: "ollama",
545
+ model: selectedModel,
546
+ text: data.response || "",
547
+ tokens: {
548
+ input: data.prompt_eval_count || 0,
549
+ output: data.eval_count || 0
550
+ }
551
+ };
552
+ } catch (err) {
553
+ clearTimeout(timer);
554
+ throw err;
555
+ }
388
556
  }
557
+
389
558
  // ============================================================================
390
559
  // OUTPUT SANITIZATION
391
560
  // ============================================================================
561
+
392
562
  /**
393
563
  * Strip markdown code fences that wrap the entire LLM response.
394
564
  * Models frequently ignore "no code fences" instructions and wrap HTML/JSON/etc.
@@ -396,278 +566,331 @@ async function callOllama(prompt, model, systemPrompt) {
396
566
  * Only strips when fences wrap the ENTIRE response (not inline code blocks).
397
567
  */
398
568
  function stripCodeFences(text) {
399
- const trimmed = text.trim();
400
- // Match opening ```<optional-lang>\n and closing \n```
401
- const match = trimmed.match(/^```[\w]*\s*\n([\s\S]*?)\n\s*```\s*$/);
402
- return match ? match[1] : trimmed;
569
+ const trimmed = text.trim();
570
+ // Match opening ```<optional-lang>\n and closing \n```
571
+ const match = trimmed.match(/^```[\w]*\s*\n([\s\S]*?)\n\s*```\s*$/);
572
+ return match ? match[1] : trimmed;
403
573
  }
574
+
404
575
  // ============================================================================
405
576
  // FAILOVER LOGIC
406
577
  // ============================================================================
578
+
407
579
  const FAILOVER_ORDER = ["anthropic", "openai", "google", "bedrock", "ollama"];
580
+
408
581
  // Model ownership: which provider does a given model belong to?
409
582
  const MODEL_PROVIDER_MAP = {};
410
- for (const m of ANTHROPIC_MODELS)
411
- MODEL_PROVIDER_MAP[m.model_id] = "anthropic";
412
- for (const m of OPENAI_MODELS)
413
- MODEL_PROVIDER_MAP[m.model_id] = "openai";
414
- for (const m of GOOGLE_MODELS)
415
- MODEL_PROVIDER_MAP[m.model_id] = "google";
416
- for (const m of BEDROCK_MODELS)
417
- MODEL_PROVIDER_MAP[m.model_id] = "bedrock";
418
- for (const m of OLLAMA_MODELS)
419
- MODEL_PROVIDER_MAP[m.model_id] = "ollama";
583
+ for (const m of ANTHROPIC_MODELS) MODEL_PROVIDER_MAP[m.model_id] = "anthropic";
584
+ for (const m of OPENAI_MODELS) MODEL_PROVIDER_MAP[m.model_id] = "openai";
585
+ for (const m of GOOGLE_MODELS) MODEL_PROVIDER_MAP[m.model_id] = "google";
586
+ for (const m of BEDROCK_MODELS) MODEL_PROVIDER_MAP[m.model_id] = "bedrock";
587
+ for (const m of OLLAMA_MODELS) MODEL_PROVIDER_MAP[m.model_id] = "ollama";
588
+
420
589
  /** Returns true if the error is transient and worth retrying on the same provider */
421
590
  function isRetryableError(err) {
422
- if (err instanceof Error) {
423
- const msg = err.message || "";
424
- // HTTP status codes that are transient
425
- if (/\b(429|503|529)\b/.test(msg))
426
- return true;
427
- // Network errors
428
- if (/ECONNRESET|ETIMEDOUT|ENOTFOUND|socket hang up/i.test(msg))
429
- return true;
430
- // Abort / timeout from our AbortController
431
- if (msg.includes("aborted") || msg.includes("timeout"))
432
- return true;
433
- // Check for status property on the error (e.g. Anthropic SDK errors)
434
- const statusErr = err;
435
- if (statusErr.status && [429, 503, 529].includes(statusErr.status))
436
- return true;
437
- }
438
- return false;
591
+ if (err instanceof Error) {
592
+ const msg = err.message || "";
593
+ // HTTP status codes that are transient
594
+ if (/\b(429|503|529)\b/.test(msg)) return true;
595
+ // Network errors
596
+ if (/ECONNRESET|ETIMEDOUT|ENOTFOUND|socket hang up/i.test(msg)) return true;
597
+ // Abort / timeout from our AbortController
598
+ if (msg.includes("aborted") || msg.includes("timeout")) return true;
599
+ // Check for status property on the error (e.g. Anthropic SDK errors)
600
+ const statusErr = err;
601
+ if (statusErr.status && [429, 503, 529].includes(statusErr.status)) return true;
602
+ }
603
+ return false;
439
604
  }
440
605
  function sleep(ms) {
441
- return new Promise((resolve) => setTimeout(resolve, ms));
606
+ return new Promise(resolve => setTimeout(resolve, ms));
442
607
  }
608
+
443
609
  /** Resolve the model to use for a given provider, clearing it if it doesn't belong to that provider */
444
610
  function resolveModelForProvider(model, targetProvider) {
445
- if (!model)
446
- return undefined;
447
- const ownerProvider = MODEL_PROVIDER_MAP[model];
448
- // If the model belongs to the target provider, use it as-is
449
- if (ownerProvider === targetProvider)
450
- return model;
451
- // Otherwise, let the provider use its default
452
- return undefined;
611
+ if (!model) return undefined;
612
+ const ownerProvider = MODEL_PROVIDER_MAP[model];
613
+ // If the model belongs to the target provider, use it as-is
614
+ if (ownerProvider === targetProvider) return model;
615
+ // Otherwise, let the provider use its default
616
+ return undefined;
453
617
  }
454
618
  async function completeWithFailover(creds, prompt, model, provider, maxTokens, temperature, systemPrompt) {
455
- // Defense-in-depth: cap max_tokens even if caller didn't
456
- const MAX_TOKENS_CEILING = 16384;
457
- const cappedMaxTokens = Math.min(maxTokens, MAX_TOKENS_CEILING);
458
- const providers = provider ? [provider] : FAILOVER_ORDER;
459
- const errors = [];
460
- for (const p of providers) {
461
- // Resolve model: use original if it belongs to this provider, otherwise let provider default
462
- const effectiveModel = resolveModelForProvider(model, p);
463
- // Attempt up to 2 tries (initial + 1 retry for transient errors)
464
- for (let attempt = 0; attempt < 2; attempt++) {
465
- try {
466
- switch (p) {
467
- case "anthropic": {
468
- if (!creds.anthropic) {
469
- errors.push("anthropic: no API key configured");
470
- break;
471
- }
472
- const result = await callAnthropic(creds.anthropic.apiKey, prompt, effectiveModel, cappedMaxTokens, temperature, systemPrompt);
473
- result.text = stripCodeFences(result.text);
474
- return { success: true, data: result };
475
- }
476
- case "openai": {
477
- if (!creds.openai) {
478
- errors.push("openai: no API key configured");
479
- break;
480
- }
481
- const result = await callOpenAI(creds.openai.apiKey, prompt, effectiveModel, cappedMaxTokens, temperature, systemPrompt);
482
- result.text = stripCodeFences(result.text);
483
- return { success: true, data: result };
484
- }
485
- case "google": {
486
- if (!creds.google) {
487
- errors.push("google: no API key configured");
488
- break;
489
- }
490
- const result = await callGoogle(creds.google.apiKey, prompt, effectiveModel, cappedMaxTokens, temperature, systemPrompt);
491
- result.text = stripCodeFences(result.text);
492
- return { success: true, data: result };
493
- }
494
- case "bedrock": {
495
- if (!creds.bedrock) {
496
- errors.push("bedrock: no AWS credentials configured");
497
- break;
498
- }
499
- const result = await callBedrock(creds.bedrock.accessKeyId, creds.bedrock.secretAccessKey, creds.bedrock.region, prompt, effectiveModel, cappedMaxTokens, temperature, systemPrompt);
500
- result.text = stripCodeFences(result.text);
501
- return { success: true, data: result };
502
- }
503
- case "ollama": {
504
- if (!creds.ollama?.available) {
505
- errors.push("ollama: local server not available");
506
- break;
507
- }
508
- const result = await callOllama(prompt, effectiveModel, systemPrompt);
509
- result.text = stripCodeFences(result.text);
510
- return { success: true, data: result };
511
- }
512
- default:
513
- errors.push(`${p}: unknown provider`);
514
- }
515
- // If we hit a break (no credentials), skip retry and move to next provider
619
+ // Defense-in-depth: cap max_tokens even if caller didn't
620
+ const MAX_TOKENS_CEILING = 16384;
621
+ const cappedMaxTokens = Math.min(maxTokens, MAX_TOKENS_CEILING);
622
+ const providers = provider ? [provider] : FAILOVER_ORDER;
623
+ const errors = [];
624
+ for (const p of providers) {
625
+ // Resolve model: use original if it belongs to this provider, otherwise let provider default
626
+ const effectiveModel = resolveModelForProvider(model, p);
627
+
628
+ // Attempt up to 2 tries (initial + 1 retry for transient errors)
629
+ for (let attempt = 0; attempt < 2; attempt++) {
630
+ try {
631
+ switch (p) {
632
+ case "anthropic":
633
+ {
634
+ if (!creds.anthropic) {
635
+ errors.push("anthropic: no API key configured");
516
636
  break;
637
+ }
638
+ const result = await callAnthropic(creds.anthropic.apiKey, prompt, effectiveModel, cappedMaxTokens, temperature, systemPrompt);
639
+ result.text = stripCodeFences(result.text);
640
+ return {
641
+ success: true,
642
+ data: result
643
+ };
517
644
  }
518
- catch (err) {
519
- const msg = err instanceof Error ? err.message : String(err);
520
- if (attempt === 0 && isRetryableError(err)) {
521
- // Retry the same provider once after a short delay
522
- console.warn(`[llm-failover] ${p} transient error (attempt ${attempt + 1}), retrying in 1.5s:`, msg);
523
- await sleep(1500);
524
- continue;
525
- }
526
- errors.push(`${p}: ${msg}`);
527
- console.error(`[llm-failover] ${p} failed (attempt ${attempt + 1}):`, msg);
528
- // Break out of retry loop, move to next provider
645
+ case "openai":
646
+ {
647
+ if (!creds.openai) {
648
+ errors.push("openai: no API key configured");
529
649
  break;
650
+ }
651
+ const result = await callOpenAI(creds.openai.apiKey, prompt, effectiveModel, cappedMaxTokens, temperature, systemPrompt);
652
+ result.text = stripCodeFences(result.text);
653
+ return {
654
+ success: true,
655
+ data: result
656
+ };
657
+ }
658
+ case "google":
659
+ {
660
+ if (!creds.google) {
661
+ errors.push("google: no API key configured");
662
+ break;
663
+ }
664
+ const result = await callGoogle(creds.google.apiKey, prompt, effectiveModel, cappedMaxTokens, temperature, systemPrompt);
665
+ result.text = stripCodeFences(result.text);
666
+ return {
667
+ success: true,
668
+ data: result
669
+ };
530
670
  }
671
+ case "bedrock":
672
+ {
673
+ if (!creds.bedrock) {
674
+ errors.push("bedrock: no AWS credentials configured");
675
+ break;
676
+ }
677
+ const result = await callBedrock(creds.bedrock.accessKeyId, creds.bedrock.secretAccessKey, creds.bedrock.region, prompt, effectiveModel, cappedMaxTokens, temperature, systemPrompt);
678
+ result.text = stripCodeFences(result.text);
679
+ return {
680
+ success: true,
681
+ data: result
682
+ };
683
+ }
684
+ case "ollama":
685
+ {
686
+ if (!creds.ollama?.available) {
687
+ errors.push("ollama: local server not available");
688
+ break;
689
+ }
690
+ const result = await callOllama(prompt, effectiveModel, systemPrompt);
691
+ result.text = stripCodeFences(result.text);
692
+ return {
693
+ success: true,
694
+ data: result
695
+ };
696
+ }
697
+ default:
698
+ errors.push(`${p}: unknown provider`);
531
699
  }
700
+ // If we hit a break (no credentials), skip retry and move to next provider
701
+ break;
702
+ } catch (err) {
703
+ const msg = err instanceof Error ? err.message : String(err);
704
+ if (attempt === 0 && isRetryableError(err)) {
705
+ // Retry the same provider once after a short delay
706
+ console.warn(`[llm-failover] ${p} transient error (attempt ${attempt + 1}), retrying in 1.5s:`, msg);
707
+ await sleep(1500);
708
+ continue;
709
+ }
710
+ errors.push(`${p}: ${msg}`);
711
+ console.error(`[llm-failover] ${p} failed (attempt ${attempt + 1}):`, msg);
712
+ // Break out of retry loop, move to next provider
713
+ break;
714
+ }
532
715
  }
533
- return {
534
- success: false,
535
- error: `All providers failed. ${errors.join(" | ")}`,
536
- };
716
+ }
717
+ return {
718
+ success: false,
719
+ error: `All providers failed. ${errors.join(" | ")}`
720
+ };
537
721
  }
722
+
538
723
  // ============================================================================
539
724
  // HANDLER
540
725
  // ============================================================================
726
+
541
727
  export async function handleLLM(sb, args, storeId) {
542
- const action = args.action;
543
- if (!storeId) {
544
- return { success: false, error: "store_id is required for LLM provider operations" };
545
- }
546
- switch (action) {
547
- // ================================================================
548
- // COMPLETE — send a completion request with failover
549
- // ================================================================
550
- case "complete": {
551
- const prompt = args.prompt;
552
- if (!prompt) {
553
- return { success: false, error: "prompt is required for complete action" };
554
- }
555
- // P1 FIX: Cap prompt size to prevent unbounded input token costs
556
- const MAX_PROMPT_CHARS = 500_000; // ~125K tokens at 4 chars/token
557
- if (prompt.length > MAX_PROMPT_CHARS) {
558
- return { success: false, error: `Prompt too large: ${(prompt.length / 1000).toFixed(0)}K chars (max ${MAX_PROMPT_CHARS / 1000}K)` };
559
- }
560
- const model = args.model;
561
- const provider = args.provider;
562
- // P1 FIX: Cap max_tokens at 16384 to prevent runaway cost
563
- const maxTokens = Math.min(args.max_tokens || 1024, 16384);
564
- const temperature = args.temperature ?? 0.7;
565
- const systemPrompt = args.system;
566
- if (provider && !FAILOVER_ORDER.includes(provider)) {
567
- return { success: false, error: `Invalid provider: ${provider}. Must be one of: ${FAILOVER_ORDER.join(", ")}` };
568
- }
569
- const creds = await getCredentials(sb, storeId);
570
- return completeWithFailover(creds, prompt, model, provider, maxTokens, temperature, systemPrompt);
728
+ const action = args.action;
729
+ if (!storeId) {
730
+ return {
731
+ success: false,
732
+ error: "store_id is required for LLM provider operations"
733
+ };
734
+ }
735
+ switch (action) {
736
+ // ================================================================
737
+ // COMPLETE send a completion request with failover
738
+ // ================================================================
739
+ case "complete":
740
+ {
741
+ const prompt = args.prompt;
742
+ if (!prompt) {
743
+ return {
744
+ success: false,
745
+ error: "prompt is required for complete action"
746
+ };
571
747
  }
572
- // ================================================================
573
- // LIST_MODELS list available models across configured providers
574
- // ================================================================
575
- case "list_models": {
576
- const creds = await getCredentials(sb, storeId);
577
- const models = [];
578
- if (creds.anthropic) {
579
- models.push(...ANTHROPIC_MODELS.map((m) => ({ provider: "anthropic", ...m })));
580
- }
581
- if (creds.openai) {
582
- models.push(...OPENAI_MODELS.map((m) => ({ provider: "openai", ...m })));
583
- }
584
- if (creds.google) {
585
- models.push(...GOOGLE_MODELS.map((m) => ({ provider: "google", ...m })));
586
- }
587
- if (creds.bedrock) {
588
- models.push(...BEDROCK_MODELS.map((m) => ({ provider: "bedrock", ...m })));
589
- }
590
- if (creds.ollama?.available) {
591
- // Try to get actual installed models from Ollama
592
- try {
593
- const controller = new AbortController();
594
- const timer = setTimeout(() => controller.abort(), 3000);
595
- const resp = await fetch("http://localhost:11434/api/tags", { signal: controller.signal });
596
- clearTimeout(timer);
597
- if (resp.ok) {
598
- const data = await resp.json();
599
- if (data.models?.length) {
600
- models.push(...data.models.map((m) => ({
601
- provider: "ollama",
602
- model_id: m.name,
603
- name: `${m.name} (local)`,
604
- context_window: 0, // Ollama doesn't report this via API
605
- })));
606
- }
607
- else {
608
- models.push(...OLLAMA_MODELS.map((m) => ({ provider: "ollama", ...m })));
609
- }
610
- }
611
- }
612
- catch {
613
- models.push(...OLLAMA_MODELS.map((m) => ({ provider: "ollama", ...m })));
614
- }
615
- }
616
- return { success: true, data: { models, total: models.length } };
748
+ // P1 FIX: Cap prompt size to prevent unbounded input token costs
749
+ const MAX_PROMPT_CHARS = 500_000; // ~125K tokens at 4 chars/token
750
+ if (prompt.length > MAX_PROMPT_CHARS) {
751
+ return {
752
+ success: false,
753
+ error: `Prompt too large: ${(prompt.length / 1000).toFixed(0)}K chars (max ${MAX_PROMPT_CHARS / 1000}K)`
754
+ };
617
755
  }
618
- // ================================================================
619
- // FAILOVER_STATUS show provider configuration and health
620
- // ================================================================
621
- case "failover_status": {
622
- const creds = await getCredentials(sb, storeId);
623
- const providers = [
624
- {
625
- provider: "anthropic",
626
- configured: !!creds.anthropic,
627
- source: creds.anthropic ? "process.env.ANTHROPIC_API_KEY" : null,
628
- priority: 1,
629
- },
630
- {
631
- provider: "openai",
632
- configured: !!creds.openai,
633
- source: creds.openai ? "user_tool_secrets (encrypted)" : null,
634
- priority: 2,
635
- },
636
- {
637
- provider: "google",
638
- configured: !!creds.google,
639
- source: creds.google ? "user_tool_secrets (encrypted)" : null,
640
- priority: 3,
641
- },
642
- {
643
- provider: "bedrock",
644
- configured: !!creds.bedrock,
645
- source: creds.bedrock ? "user_tool_secrets (encrypted)" : null,
646
- region: creds.bedrock?.region || null,
647
- priority: 4,
648
- },
649
- {
650
- provider: "ollama",
651
- configured: !!creds.ollama?.available,
652
- source: creds.ollama?.available ? "localhost:11434" : null,
653
- priority: 5,
654
- },
655
- ];
656
- const configuredCount = providers.filter((p) => p.configured).length;
657
- return {
658
- success: true,
659
- data: {
660
- providers,
661
- failover_order: FAILOVER_ORDER,
662
- configured_count: configuredCount,
663
- total_providers: providers.length,
664
- note: configuredCount === 0
665
- ? "No LLM providers configured. Add API keys to user_tool_secrets."
666
- : `${configuredCount} provider(s) ready. Failover will try in order: ${FAILOVER_ORDER.filter((p) => providers.find((pr) => pr.provider === p)?.configured).join(" → ")}`,
667
- },
668
- };
756
+ const model = args.model;
757
+ const provider = args.provider;
758
+ // P1 FIX: Cap max_tokens at 16384 to prevent runaway cost
759
+ const maxTokens = Math.min(args.max_tokens || 1024, 16384);
760
+ const temperature = args.temperature ?? 0.7;
761
+ const systemPrompt = args.system;
762
+ if (provider && !FAILOVER_ORDER.includes(provider)) {
763
+ return {
764
+ success: false,
765
+ error: `Invalid provider: ${provider}. Must be one of: ${FAILOVER_ORDER.join(", ")}`
766
+ };
669
767
  }
670
- default:
671
- return { success: false, error: `Unknown LLM action: ${action}. Valid actions: complete, list_models, failover_status` };
672
- }
768
+ const creds = await getCredentials(sb, storeId);
769
+ return completeWithFailover(creds, prompt, model, provider, maxTokens, temperature, systemPrompt);
770
+ }
771
+
772
+ // ================================================================
773
+ // LIST_MODELS — list available models across configured providers
774
+ // ================================================================
775
+ case "list_models":
776
+ {
777
+ const creds = await getCredentials(sb, storeId);
778
+ const models = [];
779
+ if (creds.anthropic) {
780
+ models.push(...ANTHROPIC_MODELS.map(m => ({
781
+ provider: "anthropic",
782
+ ...m
783
+ })));
784
+ }
785
+ if (creds.openai) {
786
+ models.push(...OPENAI_MODELS.map(m => ({
787
+ provider: "openai",
788
+ ...m
789
+ })));
790
+ }
791
+ if (creds.google) {
792
+ models.push(...GOOGLE_MODELS.map(m => ({
793
+ provider: "google",
794
+ ...m
795
+ })));
796
+ }
797
+ if (creds.bedrock) {
798
+ models.push(...BEDROCK_MODELS.map(m => ({
799
+ provider: "bedrock",
800
+ ...m
801
+ })));
802
+ }
803
+ if (creds.ollama?.available) {
804
+ // Try to get actual installed models from Ollama
805
+ try {
806
+ const controller = new AbortController();
807
+ const timer = setTimeout(() => controller.abort(), 3000);
808
+ const resp = await fetch("http://localhost:11434/api/tags", {
809
+ signal: controller.signal
810
+ });
811
+ clearTimeout(timer);
812
+ if (resp.ok) {
813
+ const data = await resp.json();
814
+ if (data.models?.length) {
815
+ models.push(...data.models.map(m => ({
816
+ provider: "ollama",
817
+ model_id: m.name,
818
+ name: `${m.name} (local)`,
819
+ context_window: 0 // Ollama doesn't report this via API
820
+ })));
821
+ } else {
822
+ models.push(...OLLAMA_MODELS.map(m => ({
823
+ provider: "ollama",
824
+ ...m
825
+ })));
826
+ }
827
+ }
828
+ } catch {
829
+ models.push(...OLLAMA_MODELS.map(m => ({
830
+ provider: "ollama",
831
+ ...m
832
+ })));
833
+ }
834
+ }
835
+ return {
836
+ success: true,
837
+ data: {
838
+ models,
839
+ total: models.length
840
+ }
841
+ };
842
+ }
843
+
844
+ // ================================================================
845
+ // FAILOVER_STATUS — show provider configuration and health
846
+ // ================================================================
847
+ case "failover_status":
848
+ {
849
+ const creds = await getCredentials(sb, storeId);
850
+ const providers = [{
851
+ provider: "anthropic",
852
+ configured: !!creds.anthropic,
853
+ source: creds.anthropic ? "process.env.ANTHROPIC_API_KEY" : null,
854
+ priority: 1
855
+ }, {
856
+ provider: "openai",
857
+ configured: !!creds.openai,
858
+ source: creds.openai ? "user_tool_secrets (encrypted)" : null,
859
+ priority: 2
860
+ }, {
861
+ provider: "google",
862
+ configured: !!creds.google,
863
+ source: creds.google ? "user_tool_secrets (encrypted)" : null,
864
+ priority: 3
865
+ }, {
866
+ provider: "bedrock",
867
+ configured: !!creds.bedrock,
868
+ source: creds.bedrock ? "user_tool_secrets (encrypted)" : null,
869
+ region: creds.bedrock?.region || null,
870
+ priority: 4
871
+ }, {
872
+ provider: "ollama",
873
+ configured: !!creds.ollama?.available,
874
+ source: creds.ollama?.available ? "localhost:11434" : null,
875
+ priority: 5
876
+ }];
877
+ const configuredCount = providers.filter(p => p.configured).length;
878
+ return {
879
+ success: true,
880
+ data: {
881
+ providers,
882
+ failover_order: FAILOVER_ORDER,
883
+ configured_count: configuredCount,
884
+ total_providers: providers.length,
885
+ note: configuredCount === 0 ? "No LLM providers configured. Add API keys to user_tool_secrets." : `${configuredCount} provider(s) ready. Failover will try in order: ${FAILOVER_ORDER.filter(p => providers.find(pr => pr.provider === p)?.configured).join(" → ")}`
886
+ }
887
+ };
888
+ }
889
+ default:
890
+ return {
891
+ success: false,
892
+ error: `Unknown LLM action: ${action}. Valid actions: complete, list_models, failover_status`
893
+ };
894
+ }
673
895
  }
896
+ //# sourceMappingURL=llm-providers.js.map