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
@@ -6,205 +6,227 @@
6
6
  * it is marked degraded and requests are routed to the next healthy
7
7
  * provider in the chain. Degraded providers are re-checked every 60s.
8
8
  */
9
+
9
10
  import { getProvider } from "../../shared/constants.js";
10
11
  import { canProviderHandleRequest } from "./provider-capabilities.js";
12
+
13
+ // ============================================================================
14
+ // TYPES
15
+ // ============================================================================
16
+
11
17
  // ============================================================================
12
18
  // CONSTANTS
13
19
  // ============================================================================
20
+
14
21
  const DEGRADATION_THRESHOLD = 3; // consecutive failures to mark degraded
15
22
  const FAILURE_WINDOW_MS = 5 * 60 * 1000; // 5 minutes — failures outside this window don't count
16
23
  const RECOVERY_CHECK_MS = 60 * 1000; // 60 seconds — how often to auto-recover degraded providers
24
+
17
25
  // Default fallback model mapping — when a provider is degraded, use the
18
26
  // equivalent-tier model from the fallback provider.
19
27
  const FALLBACK_MODELS = {
20
- // If anthropic is down, which openai/gemini model to use
21
- anthropic: {
22
- openai: "gpt-5",
23
- gemini: "gemini-2.5-pro",
24
- },
25
- // If openai is down, which anthropic/gemini model to use
26
- openai: {
27
- anthropic: "claude-sonnet-4-6",
28
- gemini: "gemini-2.5-pro",
29
- },
30
- // If gemini is down, which anthropic/openai model to use
31
- gemini: {
32
- anthropic: "claude-sonnet-4-6",
33
- openai: "gpt-5",
34
- },
28
+ // If anthropic is down, which openai/gemini model to use
29
+ anthropic: {
30
+ openai: "gpt-5",
31
+ gemini: "gemini-2.5-pro"
32
+ },
33
+ // If openai is down, which anthropic/gemini model to use
34
+ openai: {
35
+ anthropic: "claude-sonnet-4-6",
36
+ gemini: "gemini-2.5-pro"
37
+ },
38
+ // If gemini is down, which anthropic/openai model to use
39
+ gemini: {
40
+ anthropic: "claude-sonnet-4-6",
41
+ openai: "gpt-5"
42
+ }
35
43
  };
44
+
36
45
  // ============================================================================
37
46
  // PROVIDER FAILOVER CLASS
38
47
  // ============================================================================
48
+
39
49
  export class ProviderFailover {
40
- providers;
41
- chain;
42
- recoveryTimer = null;
43
- auditLog = [];
44
- constructor(chain) {
45
- this.chain = chain;
46
- this.providers = new Map();
47
- for (const name of chain) {
48
- this.providers.set(name, {
49
- name,
50
- status: "healthy",
51
- consecutiveFailures: 0,
52
- lastFailure: 0,
53
- degradedAt: 0,
54
- });
55
- }
50
+ recoveryTimer = null;
51
+ auditLog = [];
52
+ constructor(chain) {
53
+ this.chain = chain;
54
+ this.providers = new Map();
55
+ for (const name of chain) {
56
+ this.providers.set(name, {
57
+ name,
58
+ status: "healthy",
59
+ consecutiveFailures: 0,
60
+ lastFailure: 0,
61
+ degradedAt: 0
62
+ });
56
63
  }
57
- /**
58
- * Returns the provider (and optionally a fallback model) to use.
59
- * If the requested provider is healthy, returns it as-is.
60
- * If degraded, walks the chain to find the next healthy provider
61
- * and returns a sensible fallback model for that provider.
62
- *
63
- * When requiredCapabilities is provided, failover candidates that lack
64
- * the required capabilities are skipped — prevents routing a PDF request
65
- * to a provider that doesn't support PDFs, for example.
66
- */
67
- getActiveProvider(requestedModel, requiredCapabilities) {
68
- const originalProvider = getProvider(requestedModel);
69
- const health = this.providers.get(originalProvider);
70
- // If provider is healthy (or unknown to chain), use as-is
71
- if (!health || health.status === "healthy") {
72
- return {
73
- provider: originalProvider,
74
- model: requestedModel,
75
- failedOver: false,
76
- originalProvider,
77
- };
64
+ }
65
+
66
+ /**
67
+ * Returns the provider (and optionally a fallback model) to use.
68
+ * If the requested provider is healthy, returns it as-is.
69
+ * If degraded, walks the chain to find the next healthy provider
70
+ * and returns a sensible fallback model for that provider.
71
+ *
72
+ * When requiredCapabilities is provided, failover candidates that lack
73
+ * the required capabilities are skipped — prevents routing a PDF request
74
+ * to a provider that doesn't support PDFs, for example.
75
+ */
76
+ getActiveProvider(requestedModel, requiredCapabilities) {
77
+ const originalProvider = getProvider(requestedModel);
78
+ const health = this.providers.get(originalProvider);
79
+
80
+ // If provider is healthy (or unknown to chain), use as-is
81
+ if (!health || health.status === "healthy") {
82
+ return {
83
+ provider: originalProvider,
84
+ model: requestedModel,
85
+ failedOver: false,
86
+ originalProvider
87
+ };
88
+ }
89
+
90
+ // Provider is degraded — find next healthy in chain
91
+ const chainIndex = this.chain.indexOf(originalProvider);
92
+ for (let offset = 1; offset < this.chain.length; offset++) {
93
+ const candidateIndex = (chainIndex + offset) % this.chain.length;
94
+ const candidateName = this.chain[candidateIndex];
95
+ const candidateHealth = this.providers.get(candidateName);
96
+ if (candidateHealth && candidateHealth.status === "healthy") {
97
+ // Skip candidates that can't handle the request's required capabilities
98
+ if (requiredCapabilities && !canProviderHandleRequest(candidateName, requiredCapabilities)) {
99
+ console.log(`[failover] Skipping ${candidateName} — lacks required capabilities`);
100
+ continue;
78
101
  }
79
- // Provider is degraded — find next healthy in chain
80
- const chainIndex = this.chain.indexOf(originalProvider);
81
- for (let offset = 1; offset < this.chain.length; offset++) {
82
- const candidateIndex = (chainIndex + offset) % this.chain.length;
83
- const candidateName = this.chain[candidateIndex];
84
- const candidateHealth = this.providers.get(candidateName);
85
- if (candidateHealth && candidateHealth.status === "healthy") {
86
- // Skip candidates that can't handle the request's required capabilities
87
- if (requiredCapabilities &&
88
- !canProviderHandleRequest(candidateName, requiredCapabilities)) {
89
- console.log(`[failover] Skipping ${candidateName} — lacks required capabilities`);
90
- continue;
91
- }
92
- // Map to a fallback model for the candidate provider
93
- const fallbackModel = FALLBACK_MODELS[originalProvider]?.[candidateName] || requestedModel;
94
- const event = {
95
- timestamp: Date.now(),
96
- originalProvider,
97
- fallbackProvider: candidateName,
98
- reason: `${originalProvider} degraded (${health.consecutiveFailures} consecutive failures)`,
99
- };
100
- this.auditLog.push(event);
101
- // Keep audit log bounded
102
- if (this.auditLog.length > 1000) {
103
- this.auditLog = this.auditLog.slice(-500);
104
- }
105
- console.log(`[failover] ${originalProvider} degraded, routing to ${candidateName} (model: ${fallbackModel})`);
106
- return {
107
- provider: candidateName,
108
- model: fallbackModel,
109
- failedOver: true,
110
- originalProvider,
111
- };
112
- }
102
+
103
+ // Map to a fallback model for the candidate provider
104
+ const fallbackModel = FALLBACK_MODELS[originalProvider]?.[candidateName] || requestedModel;
105
+ const event = {
106
+ timestamp: Date.now(),
107
+ originalProvider,
108
+ fallbackProvider: candidateName,
109
+ reason: `${originalProvider} degraded (${health.consecutiveFailures} consecutive failures)`
110
+ };
111
+ this.auditLog.push(event);
112
+
113
+ // Keep audit log bounded
114
+ if (this.auditLog.length > 1000) {
115
+ this.auditLog = this.auditLog.slice(-500);
113
116
  }
114
- // All providers degraded (or none have required capabilities) — use the original anyway
115
- console.log(`[failover] All providers degraded, attempting ${originalProvider} anyway`);
117
+ console.log(`[failover] ${originalProvider} degraded, routing to ${candidateName} (model: ${fallbackModel})`);
116
118
  return {
117
- provider: originalProvider,
118
- model: requestedModel,
119
- failedOver: false,
120
- originalProvider,
119
+ provider: candidateName,
120
+ model: fallbackModel,
121
+ failedOver: true,
122
+ originalProvider
121
123
  };
124
+ }
122
125
  }
123
- /**
124
- * Record a successful API callresets consecutive failures and
125
- * marks the provider healthy if it was degraded.
126
- */
127
- recordSuccess(provider) {
128
- const health = this.providers.get(provider);
129
- if (!health)
130
- return;
131
- const wasDegraded = health.status === "degraded";
132
- health.consecutiveFailures = 0;
133
- health.status = "healthy";
134
- if (wasDegraded) {
135
- console.log(`[failover] ${provider} recoveredmarked healthy`);
136
- }
126
+
127
+ // All providers degraded (or none have required capabilities) use the original anyway
128
+ console.log(`[failover] All providers degraded, attempting ${originalProvider} anyway`);
129
+ return {
130
+ provider: originalProvider,
131
+ model: requestedModel,
132
+ failedOver: false,
133
+ originalProvider
134
+ };
135
+ }
136
+
137
+ /**
138
+ * Record a successful API call resets consecutive failures and
139
+ * marks the provider healthy if it was degraded.
140
+ */
141
+ recordSuccess(provider) {
142
+ const health = this.providers.get(provider);
143
+ if (!health) return;
144
+ const wasDegraded = health.status === "degraded";
145
+ health.consecutiveFailures = 0;
146
+ health.status = "healthy";
147
+ if (wasDegraded) {
148
+ console.log(`[failover] ${provider} recovered — marked healthy`);
137
149
  }
138
- /**
139
- * Record a failed API call — increments consecutive failures.
140
- * If threshold is reached within the failure window, marks degraded.
141
- */
142
- recordFailure(provider) {
143
- const health = this.providers.get(provider);
144
- if (!health)
145
- return;
146
- const now = Date.now();
147
- // If last failure was outside the window, reset the counter
148
- if (health.lastFailure > 0 && now - health.lastFailure > FAILURE_WINDOW_MS) {
149
- health.consecutiveFailures = 0;
150
- }
151
- health.consecutiveFailures++;
152
- health.lastFailure = now;
153
- if (health.consecutiveFailures >= DEGRADATION_THRESHOLD &&
154
- health.status === "healthy") {
155
- health.status = "degraded";
156
- health.degradedAt = now;
157
- console.log(`[failover] ${provider} marked DEGRADED after ${health.consecutiveFailures} consecutive failures`);
158
- }
150
+ }
151
+
152
+ /**
153
+ * Record a failed API call — increments consecutive failures.
154
+ * If threshold is reached within the failure window, marks degraded.
155
+ */
156
+ recordFailure(provider) {
157
+ const health = this.providers.get(provider);
158
+ if (!health) return;
159
+ const now = Date.now();
160
+
161
+ // If last failure was outside the window, reset the counter
162
+ if (health.lastFailure > 0 && now - health.lastFailure > FAILURE_WINDOW_MS) {
163
+ health.consecutiveFailures = 0;
159
164
  }
160
- /**
161
- * Start the recovery loop — checks degraded providers every 60s.
162
- * Resets them to healthy so the next request can attempt them.
163
- * If the attempt fails, recordFailure will re-degrade immediately.
164
- */
165
- startRecoveryLoop() {
166
- if (this.recoveryTimer)
167
- return; // already running
168
- this.recoveryTimer = setInterval(() => {
169
- const now = Date.now();
170
- for (const [name, health] of this.providers) {
171
- if (health.status === "degraded" &&
172
- now - health.degradedAt >= RECOVERY_CHECK_MS) {
173
- console.log(`[failover] Recovery check: resetting ${name} to healthy for re-probe`);
174
- health.status = "healthy";
175
- health.consecutiveFailures = 0;
176
- }
177
- }
178
- }, RECOVERY_CHECK_MS);
179
- // Don't let the recovery timer prevent process exit
180
- if (this.recoveryTimer && typeof this.recoveryTimer === "object" && "unref" in this.recoveryTimer) {
181
- this.recoveryTimer.unref();
182
- }
165
+ health.consecutiveFailures++;
166
+ health.lastFailure = now;
167
+ if (health.consecutiveFailures >= DEGRADATION_THRESHOLD && health.status === "healthy") {
168
+ health.status = "degraded";
169
+ health.degradedAt = now;
170
+ console.log(`[failover] ${provider} marked DEGRADED after ${health.consecutiveFailures} consecutive failures`);
183
171
  }
184
- /**
185
- * Stop the recovery loop (for clean shutdown / testing).
186
- */
187
- stopRecoveryLoop() {
188
- if (this.recoveryTimer) {
189
- clearInterval(this.recoveryTimer);
190
- this.recoveryTimer = null;
172
+ }
173
+
174
+ /**
175
+ * Start the recovery loop — checks degraded providers every 60s.
176
+ * Resets them to healthy so the next request can attempt them.
177
+ * If the attempt fails, recordFailure will re-degrade immediately.
178
+ */
179
+ startRecoveryLoop() {
180
+ if (this.recoveryTimer) return; // already running
181
+
182
+ this.recoveryTimer = setInterval(() => {
183
+ const now = Date.now();
184
+ for (const [name, health] of this.providers) {
185
+ if (health.status === "degraded" && now - health.degradedAt >= RECOVERY_CHECK_MS) {
186
+ console.log(`[failover] Recovery check: resetting ${name} to healthy for re-probe`);
187
+ health.status = "healthy";
188
+ health.consecutiveFailures = 0;
191
189
  }
190
+ }
191
+ }, RECOVERY_CHECK_MS);
192
+
193
+ // Don't let the recovery timer prevent process exit
194
+ if (this.recoveryTimer && typeof this.recoveryTimer === "object" && "unref" in this.recoveryTimer) {
195
+ this.recoveryTimer.unref();
192
196
  }
193
- /**
194
- * Get current health status of all providers.
195
- */
196
- getStatus() {
197
- return Array.from(this.providers.values()).map((h) => ({ ...h }));
198
- }
199
- /**
200
- * Get the failover audit log.
201
- */
202
- getAuditLog() {
203
- return [...this.auditLog];
197
+ }
198
+
199
+ /**
200
+ * Stop the recovery loop (for clean shutdown / testing).
201
+ */
202
+ stopRecoveryLoop() {
203
+ if (this.recoveryTimer) {
204
+ clearInterval(this.recoveryTimer);
205
+ this.recoveryTimer = null;
204
206
  }
207
+ }
208
+
209
+ /**
210
+ * Get current health status of all providers.
211
+ */
212
+ getStatus() {
213
+ return Array.from(this.providers.values()).map(h => ({
214
+ ...h
215
+ }));
216
+ }
217
+
218
+ /**
219
+ * Get the failover audit log.
220
+ */
221
+ getAuditLog() {
222
+ return [...this.auditLog];
223
+ }
205
224
  }
225
+
206
226
  // ============================================================================
207
227
  // SINGLETON — default chain: anthropic → openai → gemini
208
228
  // ============================================================================
229
+
209
230
  export const providerFailover = new ProviderFailover(["anthropic", "openai", "gemini"]);
210
231
  providerFailover.startRecoveryLoop();
232
+ //# sourceMappingURL=provider-failover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-failover.js","names":["getProvider","canProviderHandleRequest","DEGRADATION_THRESHOLD","FAILURE_WINDOW_MS","RECOVERY_CHECK_MS","FALLBACK_MODELS","anthropic","openai","gemini","ProviderFailover","recoveryTimer","auditLog","constructor","chain","providers","Map","name","set","status","consecutiveFailures","lastFailure","degradedAt","getActiveProvider","requestedModel","requiredCapabilities","originalProvider","health","get","provider","model","failedOver","chainIndex","indexOf","offset","length","candidateIndex","candidateName","candidateHealth","console","log","fallbackModel","event","timestamp","Date","now","fallbackProvider","reason","push","slice","recordSuccess","wasDegraded","recordFailure","startRecoveryLoop","setInterval","unref","stopRecoveryLoop","clearInterval","getStatus","Array","from","values","map","h","getAuditLog","providerFailover"],"sources":["../../../src/server/lib/provider-failover.ts"],"sourcesContent":["/**\n * Provider Failover Chain — Phase 4.1\n *\n * Manages provider health and automatic failover routing.\n * If a provider accumulates 3 consecutive failures within 5 minutes,\n * it is marked degraded and requests are routed to the next healthy\n * provider in the chain. Degraded providers are re-checked every 60s.\n */\n\nimport { getProvider } from \"../../shared/constants.js\";\nimport type { ModelProvider } from \"../../shared/constants.js\";\nimport { canProviderHandleRequest, type RequestCapabilityRequirements } from \"./provider-capabilities.js\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ProviderHealth {\n name: string;\n status: \"healthy\" | \"degraded\";\n consecutiveFailures: number;\n lastFailure: number;\n degradedAt: number;\n}\n\nexport interface FailoverEvent {\n timestamp: number;\n originalProvider: string;\n fallbackProvider: string;\n reason: string;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst DEGRADATION_THRESHOLD = 3; // consecutive failures to mark degraded\nconst FAILURE_WINDOW_MS = 5 * 60 * 1000; // 5 minutes — failures outside this window don't count\nconst RECOVERY_CHECK_MS = 60 * 1000; // 60 seconds — how often to auto-recover degraded providers\n\n// Default fallback model mapping — when a provider is degraded, use the\n// equivalent-tier model from the fallback provider.\nconst FALLBACK_MODELS: Record<string, Record<string, string>> = {\n // If anthropic is down, which openai/gemini model to use\n anthropic: {\n openai: \"gpt-5\",\n gemini: \"gemini-2.5-pro\",\n },\n // If openai is down, which anthropic/gemini model to use\n openai: {\n anthropic: \"claude-sonnet-4-6\",\n gemini: \"gemini-2.5-pro\",\n },\n // If gemini is down, which anthropic/openai model to use\n gemini: {\n anthropic: \"claude-sonnet-4-6\",\n openai: \"gpt-5\",\n },\n};\n\n// ============================================================================\n// PROVIDER FAILOVER CLASS\n// ============================================================================\n\nexport class ProviderFailover {\n private providers: Map<string, ProviderHealth>;\n private chain: string[];\n private recoveryTimer: ReturnType<typeof setInterval> | null = null;\n private auditLog: FailoverEvent[] = [];\n\n constructor(chain: string[]) {\n this.chain = chain;\n this.providers = new Map();\n\n for (const name of chain) {\n this.providers.set(name, {\n name,\n status: \"healthy\",\n consecutiveFailures: 0,\n lastFailure: 0,\n degradedAt: 0,\n });\n }\n }\n\n /**\n * Returns the provider (and optionally a fallback model) to use.\n * If the requested provider is healthy, returns it as-is.\n * If degraded, walks the chain to find the next healthy provider\n * and returns a sensible fallback model for that provider.\n *\n * When requiredCapabilities is provided, failover candidates that lack\n * the required capabilities are skipped — prevents routing a PDF request\n * to a provider that doesn't support PDFs, for example.\n */\n getActiveProvider(\n requestedModel: string,\n requiredCapabilities?: RequestCapabilityRequirements,\n ): {\n provider: string;\n model: string;\n failedOver: boolean;\n originalProvider: string;\n } {\n const originalProvider = getProvider(requestedModel) as string;\n const health = this.providers.get(originalProvider);\n\n // If provider is healthy (or unknown to chain), use as-is\n if (!health || health.status === \"healthy\") {\n return {\n provider: originalProvider,\n model: requestedModel,\n failedOver: false,\n originalProvider,\n };\n }\n\n // Provider is degraded — find next healthy in chain\n const chainIndex = this.chain.indexOf(originalProvider);\n for (let offset = 1; offset < this.chain.length; offset++) {\n const candidateIndex = (chainIndex + offset) % this.chain.length;\n const candidateName = this.chain[candidateIndex];\n const candidateHealth = this.providers.get(candidateName);\n\n if (candidateHealth && candidateHealth.status === \"healthy\") {\n // Skip candidates that can't handle the request's required capabilities\n if (\n requiredCapabilities &&\n !canProviderHandleRequest(candidateName as ModelProvider, requiredCapabilities)\n ) {\n console.log(\n `[failover] Skipping ${candidateName} — lacks required capabilities`,\n );\n continue;\n }\n\n // Map to a fallback model for the candidate provider\n const fallbackModel = FALLBACK_MODELS[originalProvider]?.[candidateName] || requestedModel;\n\n const event: FailoverEvent = {\n timestamp: Date.now(),\n originalProvider,\n fallbackProvider: candidateName,\n reason: `${originalProvider} degraded (${health.consecutiveFailures} consecutive failures)`,\n };\n this.auditLog.push(event);\n\n // Keep audit log bounded\n if (this.auditLog.length > 1000) {\n this.auditLog = this.auditLog.slice(-500);\n }\n\n console.log(\n `[failover] ${originalProvider} degraded, routing to ${candidateName} (model: ${fallbackModel})`,\n );\n\n return {\n provider: candidateName,\n model: fallbackModel,\n failedOver: true,\n originalProvider,\n };\n }\n }\n\n // All providers degraded (or none have required capabilities) — use the original anyway\n console.log(`[failover] All providers degraded, attempting ${originalProvider} anyway`);\n return {\n provider: originalProvider,\n model: requestedModel,\n failedOver: false,\n originalProvider,\n };\n }\n\n /**\n * Record a successful API call — resets consecutive failures and\n * marks the provider healthy if it was degraded.\n */\n recordSuccess(provider: string): void {\n const health = this.providers.get(provider);\n if (!health) return;\n\n const wasDegraded = health.status === \"degraded\";\n health.consecutiveFailures = 0;\n health.status = \"healthy\";\n\n if (wasDegraded) {\n console.log(`[failover] ${provider} recovered — marked healthy`);\n }\n }\n\n /**\n * Record a failed API call — increments consecutive failures.\n * If threshold is reached within the failure window, marks degraded.\n */\n recordFailure(provider: string): void {\n const health = this.providers.get(provider);\n if (!health) return;\n\n const now = Date.now();\n\n // If last failure was outside the window, reset the counter\n if (health.lastFailure > 0 && now - health.lastFailure > FAILURE_WINDOW_MS) {\n health.consecutiveFailures = 0;\n }\n\n health.consecutiveFailures++;\n health.lastFailure = now;\n\n if (\n health.consecutiveFailures >= DEGRADATION_THRESHOLD &&\n health.status === \"healthy\"\n ) {\n health.status = \"degraded\";\n health.degradedAt = now;\n console.log(\n `[failover] ${provider} marked DEGRADED after ${health.consecutiveFailures} consecutive failures`,\n );\n }\n }\n\n /**\n * Start the recovery loop — checks degraded providers every 60s.\n * Resets them to healthy so the next request can attempt them.\n * If the attempt fails, recordFailure will re-degrade immediately.\n */\n startRecoveryLoop(): void {\n if (this.recoveryTimer) return; // already running\n\n this.recoveryTimer = setInterval(() => {\n const now = Date.now();\n for (const [name, health] of this.providers) {\n if (\n health.status === \"degraded\" &&\n now - health.degradedAt >= RECOVERY_CHECK_MS\n ) {\n console.log(`[failover] Recovery check: resetting ${name} to healthy for re-probe`);\n health.status = \"healthy\";\n health.consecutiveFailures = 0;\n }\n }\n }, RECOVERY_CHECK_MS);\n\n // Don't let the recovery timer prevent process exit\n if (this.recoveryTimer && typeof this.recoveryTimer === \"object\" && \"unref\" in this.recoveryTimer) {\n (this.recoveryTimer as NodeJS.Timeout).unref();\n }\n }\n\n /**\n * Stop the recovery loop (for clean shutdown / testing).\n */\n stopRecoveryLoop(): void {\n if (this.recoveryTimer) {\n clearInterval(this.recoveryTimer);\n this.recoveryTimer = null;\n }\n }\n\n /**\n * Get current health status of all providers.\n */\n getStatus(): ProviderHealth[] {\n return Array.from(this.providers.values()).map((h) => ({ ...h }));\n }\n\n /**\n * Get the failover audit log.\n */\n getAuditLog(): FailoverEvent[] {\n return [...this.auditLog];\n }\n}\n\n// ============================================================================\n// SINGLETON — default chain: anthropic → openai → gemini\n// ============================================================================\n\nexport const providerFailover = new ProviderFailover([\"anthropic\", \"openai\", \"gemini\"]);\nproviderFailover.startRecoveryLoop();\n"],"mappings":"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","ignoreList":[]}