@falai/agent 2.7.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (559) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/MemoryAdapter.d.ts +1 -1
  3. package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
  4. package/dist/adapters/MemoryAdapter.js +3 -3
  5. package/dist/adapters/MemoryAdapter.js.map +1 -1
  6. package/dist/adapters/MongoAdapter.d.ts +1 -1
  7. package/dist/adapters/MongoAdapter.d.ts.map +1 -1
  8. package/dist/adapters/MongoAdapter.js +2 -2
  9. package/dist/adapters/MongoAdapter.js.map +1 -1
  10. package/dist/adapters/OpenSearchAdapter.d.ts +1 -1
  11. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  12. package/dist/adapters/OpenSearchAdapter.js +3 -3
  13. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  14. package/dist/adapters/PostgreSQLAdapter.d.ts +1 -1
  15. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  16. package/dist/adapters/PostgreSQLAdapter.js +3 -3
  17. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  18. package/dist/adapters/PrismaAdapter.d.ts +1 -1
  19. package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
  20. package/dist/adapters/PrismaAdapter.js +3 -3
  21. package/dist/adapters/PrismaAdapter.js.map +1 -1
  22. package/dist/adapters/RedisAdapter.d.ts +1 -1
  23. package/dist/adapters/RedisAdapter.d.ts.map +1 -1
  24. package/dist/adapters/RedisAdapter.js +3 -3
  25. package/dist/adapters/RedisAdapter.js.map +1 -1
  26. package/dist/adapters/SQLiteAdapter.d.ts +1 -1
  27. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  28. package/dist/adapters/SQLiteAdapter.js +3 -3
  29. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  30. package/dist/adapters/index.d.ts +13 -13
  31. package/dist/adapters/index.d.ts.map +1 -1
  32. package/dist/adapters/index.js +7 -7
  33. package/dist/adapters/index.js.map +1 -1
  34. package/dist/adapters/sessionRow.d.ts +1 -1
  35. package/dist/adapters/sessionRow.d.ts.map +1 -1
  36. package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
  37. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/MemoryAdapter.js +14 -14
  39. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  40. package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
  41. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
  42. package/dist/cjs/adapters/MongoAdapter.js +4 -4
  43. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  44. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +1 -1
  45. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  46. package/dist/cjs/adapters/OpenSearchAdapter.js +6 -6
  47. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  48. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
  49. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  50. package/dist/cjs/adapters/PostgreSQLAdapter.js +12 -12
  51. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  52. package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
  53. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
  54. package/dist/cjs/adapters/PrismaAdapter.js +7 -7
  55. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  56. package/dist/cjs/adapters/RedisAdapter.d.ts +1 -1
  57. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
  58. package/dist/cjs/adapters/RedisAdapter.js +13 -13
  59. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  60. package/dist/cjs/adapters/SQLiteAdapter.d.ts +1 -1
  61. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  62. package/dist/cjs/adapters/SQLiteAdapter.js +8 -8
  63. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  64. package/dist/cjs/adapters/index.d.ts +13 -13
  65. package/dist/cjs/adapters/index.d.ts.map +1 -1
  66. package/dist/cjs/adapters/index.js +14 -14
  67. package/dist/cjs/adapters/index.js.map +1 -1
  68. package/dist/cjs/adapters/sessionRow.d.ts +1 -1
  69. package/dist/cjs/adapters/sessionRow.d.ts.map +1 -1
  70. package/dist/cjs/core/Agent.d.ts +11 -11
  71. package/dist/cjs/core/Agent.d.ts.map +1 -1
  72. package/dist/cjs/core/Agent.js +65 -65
  73. package/dist/cjs/core/Agent.js.map +1 -1
  74. package/dist/cjs/core/AutoChainExecutor.d.ts +5 -5
  75. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
  76. package/dist/cjs/core/AutoChainExecutor.js +26 -26
  77. package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
  78. package/dist/cjs/core/BranchEvaluator.d.ts +4 -4
  79. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
  80. package/dist/cjs/core/BranchEvaluator.js +6 -6
  81. package/dist/cjs/core/BranchEvaluator.js.map +1 -1
  82. package/dist/cjs/core/CompactionEngine.d.ts +2 -2
  83. package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/DirectiveChainTracker.d.ts +1 -1
  85. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -1
  86. package/dist/cjs/core/DirectiveChainTracker.js +5 -5
  87. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -1
  88. package/dist/cjs/core/Events.d.ts +1 -1
  89. package/dist/cjs/core/Events.d.ts.map +1 -1
  90. package/dist/cjs/core/Events.js +15 -15
  91. package/dist/cjs/core/Events.js.map +1 -1
  92. package/dist/cjs/core/Flow.d.ts +4 -4
  93. package/dist/cjs/core/Flow.d.ts.map +1 -1
  94. package/dist/cjs/core/Flow.js +15 -15
  95. package/dist/cjs/core/Flow.js.map +1 -1
  96. package/dist/cjs/core/FlowRouter.d.ts +4 -4
  97. package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
  98. package/dist/cjs/core/FlowRouter.js +64 -64
  99. package/dist/cjs/core/FlowRouter.js.map +1 -1
  100. package/dist/cjs/core/PersistenceManager.d.ts +1 -1
  101. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  102. package/dist/cjs/core/PersistenceManager.js +10 -10
  103. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  104. package/dist/cjs/core/PromptComposer.d.ts +4 -4
  105. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  106. package/dist/cjs/core/PromptComposer.js +13 -13
  107. package/dist/cjs/core/PromptComposer.js.map +1 -1
  108. package/dist/cjs/core/PromptSectionCache.d.ts +2 -2
  109. package/dist/cjs/core/PromptSectionCache.d.ts.map +1 -1
  110. package/dist/cjs/core/ResponseEngine.d.ts +4 -4
  111. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  112. package/dist/cjs/core/ResponseEngine.js +7 -7
  113. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  114. package/dist/cjs/core/ResponseModal.d.ts +10 -10
  115. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  116. package/dist/cjs/core/ResponseModal.js +69 -69
  117. package/dist/cjs/core/ResponseModal.js.map +1 -1
  118. package/dist/cjs/core/ResponsePipeline.d.ts +15 -7
  119. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  120. package/dist/cjs/core/ResponsePipeline.js +99 -91
  121. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  122. package/dist/cjs/core/SessionFinalizer.d.ts +4 -4
  123. package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -1
  124. package/dist/cjs/core/SessionFinalizer.js +12 -12
  125. package/dist/cjs/core/SessionFinalizer.js.map +1 -1
  126. package/dist/cjs/core/SessionManager.d.ts +5 -5
  127. package/dist/cjs/core/SessionManager.d.ts.map +1 -1
  128. package/dist/cjs/core/SessionManager.js +8 -8
  129. package/dist/cjs/core/SessionManager.js.map +1 -1
  130. package/dist/cjs/core/SignalCoordinator.d.ts +5 -5
  131. package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -1
  132. package/dist/cjs/core/SignalCoordinator.js +12 -12
  133. package/dist/cjs/core/SignalCoordinator.js.map +1 -1
  134. package/dist/cjs/core/SignalEvaluator.d.ts +4 -4
  135. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
  136. package/dist/cjs/core/SignalEvaluator.js +6 -6
  137. package/dist/cjs/core/SignalEvaluator.js.map +1 -1
  138. package/dist/cjs/core/SignalProcessor.d.ts +6 -6
  139. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
  140. package/dist/cjs/core/SignalProcessor.js +14 -14
  141. package/dist/cjs/core/SignalProcessor.js.map +1 -1
  142. package/dist/cjs/core/Step.d.ts +5 -5
  143. package/dist/cjs/core/Step.d.ts.map +1 -1
  144. package/dist/cjs/core/Step.js +17 -17
  145. package/dist/cjs/core/Step.js.map +1 -1
  146. package/dist/cjs/core/StepLifecycle.d.ts +3 -3
  147. package/dist/cjs/core/StepLifecycle.d.ts.map +1 -1
  148. package/dist/cjs/core/StepLifecycle.js +10 -10
  149. package/dist/cjs/core/StepLifecycle.js.map +1 -1
  150. package/dist/cjs/core/StreamingToolExecutor.d.ts +1 -1
  151. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  152. package/dist/cjs/core/StreamingToolExecutor.js +5 -5
  153. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  154. package/dist/cjs/core/ToolLoopExecutor.d.ts +4 -4
  155. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -1
  156. package/dist/cjs/core/ToolLoopExecutor.js +51 -51
  157. package/dist/cjs/core/ToolLoopExecutor.js.map +1 -1
  158. package/dist/cjs/core/ToolManager.d.ts +5 -5
  159. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  160. package/dist/cjs/core/ToolManager.js +66 -66
  161. package/dist/cjs/core/ToolManager.js.map +1 -1
  162. package/dist/cjs/core/createAgent.d.ts +2 -2
  163. package/dist/cjs/core/createAgent.d.ts.map +1 -1
  164. package/dist/cjs/core/createAgent.js +2 -2
  165. package/dist/cjs/core/createAgent.js.map +1 -1
  166. package/dist/cjs/core/flow-namespace.d.ts +2 -2
  167. package/dist/cjs/core/flow-namespace.d.ts.map +1 -1
  168. package/dist/cjs/core/flow-namespace.js +4 -4
  169. package/dist/cjs/core/flow-namespace.js.map +1 -1
  170. package/dist/cjs/core/toolGates.d.ts +1 -1
  171. package/dist/cjs/core/toolGates.d.ts.map +1 -1
  172. package/dist/cjs/core/toolGates.js +3 -3
  173. package/dist/cjs/core/toolGates.js.map +1 -1
  174. package/dist/cjs/index.d.ts +50 -48
  175. package/dist/cjs/index.d.ts.map +1 -1
  176. package/dist/cjs/index.js +96 -91
  177. package/dist/cjs/index.js.map +1 -1
  178. package/dist/cjs/providers/AnthropicProvider.d.ts +25 -42
  179. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  180. package/dist/cjs/providers/AnthropicProvider.js +32 -408
  181. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  182. package/dist/cjs/providers/DeepSeekProvider.d.ts +13 -34
  183. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  184. package/dist/cjs/providers/DeepSeekProvider.js +17 -51
  185. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  186. package/dist/cjs/providers/GeminiProvider.d.ts +24 -83
  187. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  188. package/dist/cjs/providers/GeminiProvider.js +33 -514
  189. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  190. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  191. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  192. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js +14 -20
  193. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  194. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +26 -144
  195. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  196. package/dist/cjs/providers/OpenAICompatibleProvider.js +42 -523
  197. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  198. package/dist/cjs/providers/OpenAIProvider.d.ts +14 -20
  199. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  200. package/dist/cjs/providers/OpenAIProvider.js +20 -27
  201. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  202. package/dist/cjs/providers/OpenRouterProvider.d.ts +20 -24
  203. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  204. package/dist/cjs/providers/OpenRouterProvider.js +22 -38
  205. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  206. package/dist/cjs/providers/ProviderAdapter.d.ts +102 -0
  207. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -0
  208. package/dist/cjs/providers/ProviderAdapter.js +257 -0
  209. package/dist/cjs/providers/ProviderAdapter.js.map +1 -0
  210. package/dist/cjs/providers/index.d.ts +21 -18
  211. package/dist/cjs/providers/index.d.ts.map +1 -1
  212. package/dist/cjs/providers/index.js +23 -21
  213. package/dist/cjs/providers/index.js.map +1 -1
  214. package/dist/cjs/types/agent.d.ts +11 -11
  215. package/dist/cjs/types/agent.d.ts.map +1 -1
  216. package/dist/cjs/types/ai.d.ts +11 -21
  217. package/dist/cjs/types/ai.d.ts.map +1 -1
  218. package/dist/cjs/types/compaction.d.ts +2 -2
  219. package/dist/cjs/types/compaction.d.ts.map +1 -1
  220. package/dist/cjs/types/errors.d.ts +16 -20
  221. package/dist/cjs/types/errors.d.ts.map +1 -1
  222. package/dist/cjs/types/errors.js +17 -18
  223. package/dist/cjs/types/errors.js.map +1 -1
  224. package/dist/cjs/types/flow.d.ts +7 -7
  225. package/dist/cjs/types/flow.d.ts.map +1 -1
  226. package/dist/cjs/types/history.d.ts +1 -1
  227. package/dist/cjs/types/history.d.ts.map +1 -1
  228. package/dist/cjs/types/index.d.ts +17 -17
  229. package/dist/cjs/types/index.d.ts.map +1 -1
  230. package/dist/cjs/types/index.js +14 -14
  231. package/dist/cjs/types/index.js.map +1 -1
  232. package/dist/cjs/types/persistence.d.ts +2 -2
  233. package/dist/cjs/types/persistence.d.ts.map +1 -1
  234. package/dist/cjs/types/session.d.ts +4 -4
  235. package/dist/cjs/types/session.d.ts.map +1 -1
  236. package/dist/cjs/types/signals.d.ts +3 -3
  237. package/dist/cjs/types/signals.d.ts.map +1 -1
  238. package/dist/cjs/types/template.d.ts +2 -2
  239. package/dist/cjs/types/template.d.ts.map +1 -1
  240. package/dist/cjs/types/tool.d.ts +2 -2
  241. package/dist/cjs/types/tool.d.ts.map +1 -1
  242. package/dist/cjs/utils/condition.d.ts +1 -1
  243. package/dist/cjs/utils/condition.d.ts.map +1 -1
  244. package/dist/cjs/utils/condition.js +6 -6
  245. package/dist/cjs/utils/condition.js.map +1 -1
  246. package/dist/cjs/utils/event.d.ts +1 -1
  247. package/dist/cjs/utils/event.d.ts.map +1 -1
  248. package/dist/cjs/utils/event.js +2 -2
  249. package/dist/cjs/utils/event.js.map +1 -1
  250. package/dist/cjs/utils/history.d.ts +2 -2
  251. package/dist/cjs/utils/history.d.ts.map +1 -1
  252. package/dist/cjs/utils/history.js +15 -15
  253. package/dist/cjs/utils/history.js.map +1 -1
  254. package/dist/cjs/utils/index.d.ts +11 -13
  255. package/dist/cjs/utils/index.d.ts.map +1 -1
  256. package/dist/cjs/utils/index.js +57 -67
  257. package/dist/cjs/utils/index.js.map +1 -1
  258. package/dist/cjs/utils/serialize.d.ts +2 -2
  259. package/dist/cjs/utils/serialize.d.ts.map +1 -1
  260. package/dist/cjs/utils/session.d.ts +3 -3
  261. package/dist/cjs/utils/session.d.ts.map +1 -1
  262. package/dist/cjs/utils/session.js +4 -4
  263. package/dist/cjs/utils/session.js.map +1 -1
  264. package/dist/cjs/utils/template.d.ts +3 -3
  265. package/dist/cjs/utils/template.d.ts.map +1 -1
  266. package/dist/cjs/utils/template.js +5 -5
  267. package/dist/cjs/utils/template.js.map +1 -1
  268. package/dist/constants/index.d.ts +1 -0
  269. package/dist/constants/index.js +1 -1
  270. package/dist/core/Agent.d.ts +11 -11
  271. package/dist/core/Agent.d.ts.map +1 -1
  272. package/dist/core/Agent.js +13 -13
  273. package/dist/core/Agent.js.map +1 -1
  274. package/dist/core/AutoChainExecutor.d.ts +5 -5
  275. package/dist/core/AutoChainExecutor.d.ts.map +1 -1
  276. package/dist/core/AutoChainExecutor.js +5 -5
  277. package/dist/core/AutoChainExecutor.js.map +1 -1
  278. package/dist/core/BranchEvaluator.d.ts +4 -4
  279. package/dist/core/BranchEvaluator.d.ts.map +1 -1
  280. package/dist/core/BranchEvaluator.js +2 -2
  281. package/dist/core/BranchEvaluator.js.map +1 -1
  282. package/dist/core/CompactionEngine.d.ts +2 -2
  283. package/dist/core/CompactionEngine.d.ts.map +1 -1
  284. package/dist/core/DirectiveChainTracker.d.ts +1 -1
  285. package/dist/core/DirectiveChainTracker.d.ts.map +1 -1
  286. package/dist/core/DirectiveChainTracker.js +2 -2
  287. package/dist/core/DirectiveChainTracker.js.map +1 -1
  288. package/dist/core/Events.d.ts +1 -1
  289. package/dist/core/Events.d.ts.map +1 -1
  290. package/dist/core/Events.js +1 -1
  291. package/dist/core/Events.js.map +1 -1
  292. package/dist/core/Flow.d.ts +4 -4
  293. package/dist/core/Flow.d.ts.map +1 -1
  294. package/dist/core/Flow.js +3 -3
  295. package/dist/core/Flow.js.map +1 -1
  296. package/dist/core/FlowRouter.d.ts +4 -4
  297. package/dist/core/FlowRouter.d.ts.map +1 -1
  298. package/dist/core/FlowRouter.js +4 -4
  299. package/dist/core/FlowRouter.js.map +1 -1
  300. package/dist/core/PersistenceManager.d.ts +1 -1
  301. package/dist/core/PersistenceManager.d.ts.map +1 -1
  302. package/dist/core/PersistenceManager.js +3 -3
  303. package/dist/core/PersistenceManager.js.map +1 -1
  304. package/dist/core/PromptComposer.d.ts +4 -4
  305. package/dist/core/PromptComposer.d.ts.map +1 -1
  306. package/dist/core/PromptComposer.js +3 -3
  307. package/dist/core/PromptComposer.js.map +1 -1
  308. package/dist/core/PromptSectionCache.d.ts +2 -2
  309. package/dist/core/PromptSectionCache.d.ts.map +1 -1
  310. package/dist/core/ResponseEngine.d.ts +4 -4
  311. package/dist/core/ResponseEngine.d.ts.map +1 -1
  312. package/dist/core/ResponseEngine.js +2 -2
  313. package/dist/core/ResponseEngine.js.map +1 -1
  314. package/dist/core/ResponseModal.d.ts +10 -10
  315. package/dist/core/ResponseModal.d.ts.map +1 -1
  316. package/dist/core/ResponseModal.js +14 -14
  317. package/dist/core/ResponseModal.js.map +1 -1
  318. package/dist/core/ResponsePipeline.d.ts +15 -7
  319. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  320. package/dist/core/ResponsePipeline.js +25 -17
  321. package/dist/core/ResponsePipeline.js.map +1 -1
  322. package/dist/core/SessionFinalizer.d.ts +4 -4
  323. package/dist/core/SessionFinalizer.d.ts.map +1 -1
  324. package/dist/core/SessionFinalizer.js +3 -3
  325. package/dist/core/SessionFinalizer.js.map +1 -1
  326. package/dist/core/SessionManager.d.ts +5 -5
  327. package/dist/core/SessionManager.d.ts.map +1 -1
  328. package/dist/core/SessionManager.js +3 -3
  329. package/dist/core/SessionManager.js.map +1 -1
  330. package/dist/core/SignalCoordinator.d.ts +5 -5
  331. package/dist/core/SignalCoordinator.d.ts.map +1 -1
  332. package/dist/core/SignalCoordinator.js +2 -2
  333. package/dist/core/SignalCoordinator.js.map +1 -1
  334. package/dist/core/SignalEvaluator.d.ts +4 -4
  335. package/dist/core/SignalEvaluator.d.ts.map +1 -1
  336. package/dist/core/SignalEvaluator.js +2 -2
  337. package/dist/core/SignalEvaluator.js.map +1 -1
  338. package/dist/core/SignalProcessor.d.ts +6 -6
  339. package/dist/core/SignalProcessor.d.ts.map +1 -1
  340. package/dist/core/SignalProcessor.js +3 -3
  341. package/dist/core/SignalProcessor.js.map +1 -1
  342. package/dist/core/Step.d.ts +5 -5
  343. package/dist/core/Step.d.ts.map +1 -1
  344. package/dist/core/Step.js +4 -4
  345. package/dist/core/Step.js.map +1 -1
  346. package/dist/core/StepLifecycle.d.ts +3 -3
  347. package/dist/core/StepLifecycle.d.ts.map +1 -1
  348. package/dist/core/StepLifecycle.js +2 -2
  349. package/dist/core/StepLifecycle.js.map +1 -1
  350. package/dist/core/StreamingToolExecutor.d.ts +1 -1
  351. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  352. package/dist/core/StreamingToolExecutor.js +2 -2
  353. package/dist/core/StreamingToolExecutor.js.map +1 -1
  354. package/dist/core/ToolLoopExecutor.d.ts +4 -4
  355. package/dist/core/ToolLoopExecutor.d.ts.map +1 -1
  356. package/dist/core/ToolLoopExecutor.js +3 -3
  357. package/dist/core/ToolLoopExecutor.js.map +1 -1
  358. package/dist/core/ToolManager.d.ts +5 -5
  359. package/dist/core/ToolManager.d.ts.map +1 -1
  360. package/dist/core/ToolManager.js +4 -4
  361. package/dist/core/ToolManager.js.map +1 -1
  362. package/dist/core/createAgent.d.ts +2 -2
  363. package/dist/core/createAgent.d.ts.map +1 -1
  364. package/dist/core/createAgent.js +1 -1
  365. package/dist/core/createAgent.js.map +1 -1
  366. package/dist/core/flow-namespace.d.ts +2 -2
  367. package/dist/core/flow-namespace.d.ts.map +1 -1
  368. package/dist/core/flow-namespace.js +1 -1
  369. package/dist/core/flow-namespace.js.map +1 -1
  370. package/dist/core/toolGates.d.ts +1 -1
  371. package/dist/core/toolGates.d.ts.map +1 -1
  372. package/dist/core/toolGates.js +1 -1
  373. package/dist/core/toolGates.js.map +1 -1
  374. package/dist/index.d.ts +50 -48
  375. package/dist/index.d.ts.map +1 -1
  376. package/dist/index.js +34 -31
  377. package/dist/index.js.map +1 -1
  378. package/dist/providers/AnthropicProvider.d.ts +25 -42
  379. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  380. package/dist/providers/AnthropicProvider.js +32 -405
  381. package/dist/providers/AnthropicProvider.js.map +1 -1
  382. package/dist/providers/DeepSeekProvider.d.ts +13 -34
  383. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  384. package/dist/providers/DeepSeekProvider.js +16 -47
  385. package/dist/providers/DeepSeekProvider.js.map +1 -1
  386. package/dist/providers/GeminiProvider.d.ts +24 -83
  387. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  388. package/dist/providers/GeminiProvider.js +33 -514
  389. package/dist/providers/GeminiProvider.js.map +1 -1
  390. package/dist/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  391. package/dist/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  392. package/dist/providers/GenericOpenAICompatibleProvider.js +13 -16
  393. package/dist/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  394. package/dist/providers/OpenAICompatibleProvider.d.ts +26 -144
  395. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  396. package/dist/providers/OpenAICompatibleProvider.js +41 -522
  397. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  398. package/dist/providers/OpenAIProvider.d.ts +14 -20
  399. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  400. package/dist/providers/OpenAIProvider.js +19 -23
  401. package/dist/providers/OpenAIProvider.js.map +1 -1
  402. package/dist/providers/OpenRouterProvider.d.ts +20 -24
  403. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  404. package/dist/providers/OpenRouterProvider.js +21 -34
  405. package/dist/providers/OpenRouterProvider.js.map +1 -1
  406. package/dist/providers/ProviderAdapter.d.ts +102 -0
  407. package/dist/providers/ProviderAdapter.d.ts.map +1 -0
  408. package/dist/providers/ProviderAdapter.js +251 -0
  409. package/dist/providers/ProviderAdapter.js.map +1 -0
  410. package/dist/providers/index.d.ts +21 -18
  411. package/dist/providers/index.d.ts.map +1 -1
  412. package/dist/providers/index.js +13 -10
  413. package/dist/providers/index.js.map +1 -1
  414. package/dist/types/agent.d.ts +11 -11
  415. package/dist/types/agent.d.ts.map +1 -1
  416. package/dist/types/ai.d.ts +11 -21
  417. package/dist/types/ai.d.ts.map +1 -1
  418. package/dist/types/compaction.d.ts +2 -2
  419. package/dist/types/compaction.d.ts.map +1 -1
  420. package/dist/types/errors.d.ts +16 -20
  421. package/dist/types/errors.d.ts.map +1 -1
  422. package/dist/types/errors.js +15 -16
  423. package/dist/types/errors.js.map +1 -1
  424. package/dist/types/flow.d.ts +7 -7
  425. package/dist/types/flow.d.ts.map +1 -1
  426. package/dist/types/history.d.ts +1 -1
  427. package/dist/types/history.d.ts.map +1 -1
  428. package/dist/types/index.d.ts +17 -17
  429. package/dist/types/index.d.ts.map +1 -1
  430. package/dist/types/index.js +4 -4
  431. package/dist/types/index.js.map +1 -1
  432. package/dist/types/persistence.d.ts +2 -2
  433. package/dist/types/persistence.d.ts.map +1 -1
  434. package/dist/types/session.d.ts +4 -4
  435. package/dist/types/session.d.ts.map +1 -1
  436. package/dist/types/signals.d.ts +3 -3
  437. package/dist/types/signals.d.ts.map +1 -1
  438. package/dist/types/template.d.ts +2 -2
  439. package/dist/types/template.d.ts.map +1 -1
  440. package/dist/types/tool.d.ts +2 -2
  441. package/dist/types/tool.d.ts.map +1 -1
  442. package/dist/utils/condition.d.ts +1 -1
  443. package/dist/utils/condition.d.ts.map +1 -1
  444. package/dist/utils/condition.js +2 -2
  445. package/dist/utils/condition.js.map +1 -1
  446. package/dist/utils/event.d.ts +1 -1
  447. package/dist/utils/event.d.ts.map +1 -1
  448. package/dist/utils/event.js +1 -1
  449. package/dist/utils/event.js.map +1 -1
  450. package/dist/utils/history.d.ts +2 -2
  451. package/dist/utils/history.d.ts.map +1 -1
  452. package/dist/utils/history.js +1 -1
  453. package/dist/utils/history.js.map +1 -1
  454. package/dist/utils/index.d.ts +11 -13
  455. package/dist/utils/index.d.ts.map +1 -1
  456. package/dist/utils/index.js +11 -12
  457. package/dist/utils/index.js.map +1 -1
  458. package/dist/utils/serialize.d.ts +2 -2
  459. package/dist/utils/serialize.d.ts.map +1 -1
  460. package/dist/utils/session.d.ts +3 -3
  461. package/dist/utils/session.d.ts.map +1 -1
  462. package/dist/utils/session.js +2 -2
  463. package/dist/utils/session.js.map +1 -1
  464. package/dist/utils/template.d.ts +3 -3
  465. package/dist/utils/template.d.ts.map +1 -1
  466. package/dist/utils/template.js +1 -1
  467. package/dist/utils/template.js.map +1 -1
  468. package/docs/reference/branches.md +2 -0
  469. package/docs/reference/errors.md +5 -5
  470. package/docs/reference/providers.md +42 -43
  471. package/examples/01-quickstart.ts +1 -1
  472. package/examples/04-instructions.ts +1 -1
  473. package/examples/05-branching.ts +2 -2
  474. package/examples/08-persistence.ts +1 -1
  475. package/examples/tsconfig.json +6 -3
  476. package/package.json +11 -8
  477. package/src/adapters/MemoryAdapter.ts +4 -4
  478. package/src/adapters/MongoAdapter.ts +3 -3
  479. package/src/adapters/OpenSearchAdapter.ts +4 -4
  480. package/src/adapters/PostgreSQLAdapter.ts +4 -4
  481. package/src/adapters/PrismaAdapter.ts +4 -4
  482. package/src/adapters/RedisAdapter.ts +4 -4
  483. package/src/adapters/SQLiteAdapter.ts +4 -4
  484. package/src/adapters/index.ts +13 -13
  485. package/src/adapters/sessionRow.ts +1 -1
  486. package/src/core/Agent.ts +18 -18
  487. package/src/core/AutoChainExecutor.ts +9 -9
  488. package/src/core/BranchEvaluator.ts +5 -5
  489. package/src/core/CompactionEngine.ts +2 -2
  490. package/src/core/DirectiveChainTracker.ts +3 -3
  491. package/src/core/Events.ts +2 -2
  492. package/src/core/Flow.ts +9 -9
  493. package/src/core/FlowRouter.ts +8 -8
  494. package/src/core/PersistenceManager.ts +4 -4
  495. package/src/core/PromptComposer.ts +8 -8
  496. package/src/core/PromptSectionCache.ts +2 -2
  497. package/src/core/ResponseEngine.ts +6 -6
  498. package/src/core/ResponseModal.ts +24 -24
  499. package/src/core/ResponsePipeline.ts +43 -23
  500. package/src/core/SessionFinalizer.ts +7 -7
  501. package/src/core/SessionManager.ts +7 -7
  502. package/src/core/SignalCoordinator.ts +7 -7
  503. package/src/core/SignalEvaluator.ts +6 -6
  504. package/src/core/SignalProcessor.ts +9 -9
  505. package/src/core/Step.ts +9 -9
  506. package/src/core/StepLifecycle.ts +6 -6
  507. package/src/core/StreamingToolExecutor.ts +4 -4
  508. package/src/core/ToolLoopExecutor.ts +7 -7
  509. package/src/core/ToolManager.ts +9 -9
  510. package/src/core/createAgent.ts +2 -2
  511. package/src/core/flow-namespace.ts +3 -3
  512. package/src/core/toolGates.ts +2 -2
  513. package/src/index.ts +59 -48
  514. package/src/providers/AnthropicProvider.ts +46 -548
  515. package/src/providers/DeepSeekProvider.ts +27 -92
  516. package/src/providers/GeminiProvider.ts +44 -680
  517. package/src/providers/GenericOpenAICompatibleProvider.ts +19 -27
  518. package/src/providers/OpenAICompatibleProvider.ts +60 -763
  519. package/src/providers/OpenAIProvider.ts +31 -55
  520. package/src/providers/OpenRouterProvider.ts +40 -70
  521. package/src/providers/ProviderAdapter.ts +377 -0
  522. package/src/providers/index.ts +21 -23
  523. package/src/types/agent.ts +11 -11
  524. package/src/types/ai.ts +11 -21
  525. package/src/types/compaction.ts +2 -2
  526. package/src/types/errors.ts +17 -35
  527. package/src/types/flow.ts +7 -7
  528. package/src/types/history.ts +1 -1
  529. package/src/types/index.ts +17 -17
  530. package/src/types/persistence.ts +2 -2
  531. package/src/types/session.ts +4 -4
  532. package/src/types/signals.ts +3 -3
  533. package/src/types/template.ts +2 -2
  534. package/src/types/tool.ts +2 -2
  535. package/src/utils/condition.ts +3 -3
  536. package/src/utils/event.ts +1 -1
  537. package/src/utils/history.ts +3 -3
  538. package/src/utils/index.ts +11 -31
  539. package/src/utils/serialize.ts +2 -2
  540. package/src/utils/session.ts +6 -6
  541. package/src/utils/template.ts +3 -3
  542. package/dist/cjs/providers/errorClassification.d.ts +0 -68
  543. package/dist/cjs/providers/errorClassification.d.ts.map +0 -1
  544. package/dist/cjs/providers/errorClassification.js +0 -150
  545. package/dist/cjs/providers/errorClassification.js.map +0 -1
  546. package/dist/cjs/utils/retry.d.ts +0 -165
  547. package/dist/cjs/utils/retry.d.ts.map +0 -1
  548. package/dist/cjs/utils/retry.js +0 -338
  549. package/dist/cjs/utils/retry.js.map +0 -1
  550. package/dist/providers/errorClassification.d.ts +0 -68
  551. package/dist/providers/errorClassification.d.ts.map +0 -1
  552. package/dist/providers/errorClassification.js +0 -142
  553. package/dist/providers/errorClassification.js.map +0 -1
  554. package/dist/utils/retry.d.ts +0 -165
  555. package/dist/utils/retry.d.ts.map +0 -1
  556. package/dist/utils/retry.js +0 -327
  557. package/dist/utils/retry.js.map +0 -1
  558. package/src/providers/errorClassification.ts +0 -206
  559. package/src/utils/retry.ts +0 -523
@@ -1,150 +0,0 @@
1
- "use strict";
2
- /**
3
- * Shared provider error utilities: classification of SDK/HTTP errors onto
4
- * normalized ProviderErrorCode values, backup-model eligibility, and
5
- * wrapping of terminal failures in ProviderError.
6
- *
7
- * The classification is derived once and reused for both backup-model
8
- * decisions and final error wrapping, so the two can never drift apart.
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.isErrorWithStatus = isErrorWithStatus;
12
- exports.getErrorMessage = getErrorMessage;
13
- exports.classifyProviderError = classifyProviderError;
14
- exports.isBackupEligible = isBackupEligible;
15
- exports.isRetriableProviderError = isRetriableProviderError;
16
- exports.toProviderError = toProviderError;
17
- const errors_1 = require("../types/errors");
18
- /**
19
- * Type guard to check if error is ErrorWithStatus
20
- */
21
- function isErrorWithStatus(error) {
22
- return (typeof error === "object" &&
23
- error !== null &&
24
- ("status" in error || "code" in error || "message" in error));
25
- }
26
- /**
27
- * Safely extract error message
28
- */
29
- function getErrorMessage(error) {
30
- if (error instanceof Error) {
31
- return error.message;
32
- }
33
- if (isErrorWithStatus(error) && error.message) {
34
- return error.message;
35
- }
36
- return String(error);
37
- }
38
- /**
39
- * Message substrings every provider historically treated as
40
- * overloaded/unavailable for backup-model purposes.
41
- */
42
- const DEFAULT_OVERLOADED_MESSAGES = [
43
- "overloaded",
44
- "unavailable",
45
- "internal error",
46
- "Internal error",
47
- ];
48
- /**
49
- * Classify an unknown error into a normalized ProviderErrorCode.
50
- *
51
- * Overload/availability checks run first so that backup-model decisions
52
- * (rate_limited/overloaded) match the historical shouldUseBackupModel
53
- * predicate exactly.
54
- */
55
- function classifyProviderError(error, options = {}) {
56
- if (!isErrorWithStatus(error)) {
57
- return "unknown";
58
- }
59
- const { status, code, type } = error;
60
- const message = getErrorMessage(error);
61
- // Server errors / overload
62
- if (status === 500 || status === 503) {
63
- return "overloaded";
64
- }
65
- // Rate limiting
66
- if (status === 429) {
67
- return "rate_limited";
68
- }
69
- // Provider-specific overload/unavailability signals
70
- if (status !== undefined && options.overloadedStatuses?.includes(status)) {
71
- return "overloaded";
72
- }
73
- if (code !== undefined && options.overloadedCodes?.includes(code)) {
74
- return "overloaded";
75
- }
76
- if (type !== undefined && options.overloadedTypes?.includes(type)) {
77
- return "overloaded";
78
- }
79
- const overloadedMessages = options.overloadedMessages
80
- ? [...DEFAULT_OVERLOADED_MESSAGES, ...options.overloadedMessages]
81
- : DEFAULT_OVERLOADED_MESSAGES;
82
- if (overloadedMessages.some((pattern) => message.includes(pattern))) {
83
- return "overloaded";
84
- }
85
- // Non-retriable classifications (never triggered backup models)
86
- if (status === 401 || status === 403) {
87
- return "auth";
88
- }
89
- if (status === 400 || status === 404 || status === 422) {
90
- return "invalid_request";
91
- }
92
- if (status === 408 ||
93
- message.includes("timed out") ||
94
- message.includes("timeout")) {
95
- return "timeout";
96
- }
97
- if (message.includes("fetch failed") ||
98
- message.includes("ECONNREFUSED") ||
99
- message.includes("ECONNRESET") ||
100
- message.includes("ETIMEDOUT") ||
101
- message.includes("network")) {
102
- return "network";
103
- }
104
- return "unknown";
105
- }
106
- /**
107
- * Whether an error code qualifies for trying backup models.
108
- * Mirrors the historical shouldUseBackupModel predicate.
109
- */
110
- function isBackupEligible(code) {
111
- return code === "rate_limited" || code === "overloaded";
112
- }
113
- /** Errors whose name marks them as caller- or SDK-initiated aborts. */
114
- function isAbortLikeError(error) {
115
- if (!(error instanceof Error))
116
- return false;
117
- // OpenAI SDK: APIUserAbortError. Generic fetch/DOM: AbortError / TimeoutError
118
- // handled below via classification (a timeout IS retriable; a caller abort is not).
119
- return (error.name === "AbortError" ||
120
- error.name === "APIUserAbortError" ||
121
- /abort/i.test(error.message));
122
- }
123
- /**
124
- * Whether an error is worth retrying with backoff: transient availability,
125
- * rate-limiting, timeouts and network faults only. Deterministic failures —
126
- * auth (401/403), invalid request (400/404/422) and caller aborts — must fail
127
- * fast instead of burning the retry budget on the same outcome.
128
- */
129
- function isRetriableProviderError(error, options) {
130
- if (isAbortLikeError(error)) {
131
- return false;
132
- }
133
- const code = classifyProviderError(error, options);
134
- return (code === "rate_limited" ||
135
- code === "overloaded" ||
136
- code === "timeout" ||
137
- code === "network");
138
- }
139
- /**
140
- * Wrap a terminal failure (after retries/backup exhaustion) in a
141
- * normalized ProviderError, preserving the original error as `cause`.
142
- * Already-wrapped errors pass through untouched.
143
- */
144
- function toProviderError(error, provider, options) {
145
- if (error instanceof errors_1.ProviderError) {
146
- return error;
147
- }
148
- return new errors_1.ProviderError(classifyProviderError(error, options), provider, getErrorMessage(error), error);
149
- }
150
- //# sourceMappingURL=errorClassification.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errorClassification.js","sourceRoot":"","sources":["../../../src/providers/errorClassification.ts"],"names":[],"mappings":"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"}
@@ -1,165 +0,0 @@
1
- export interface RetryOptions<T> {
2
- operation: () => Promise<T>;
3
- maxRetries: number;
4
- delay: (attempt: number) => number;
5
- onRetry?: (attempt: number, error: unknown) => void;
6
- onFailure?: (error: unknown) => boolean;
7
- /**
8
- * Predicate deciding whether an error may be retried at all. When it returns
9
- * `false` the error is rethrown immediately — no backoff, no further attempts.
10
- * Providers pass a classifier here so deterministic failures (401, 400,
11
- * caller aborts) fail fast instead of burning the full retry budget.
12
- */
13
- isRetriable?: (error: unknown) => boolean;
14
- }
15
- /** Provider timeout (ms) + retry count, after defaults are applied. */
16
- export interface RetryConfig {
17
- timeout: number;
18
- retries: number;
19
- }
20
- /**
21
- * Normalize a provider's optional retry config against the defaults. `timeout`
22
- * uses `||` (a 0ms timeout is degenerate — it aborts every call immediately — so
23
- * fall back to the default), while `retries` uses `??` so an explicit
24
- * `retries: 0` (disable retries) is honored rather than treated as unset. Single
25
- * definition so this distinction can't drift between providers.
26
- */
27
- export declare function resolveRetryConfig(input?: {
28
- timeout?: number;
29
- retries?: number;
30
- }): RetryConfig;
31
- export declare function retry<T>(options: RetryOptions<T>): Promise<T>;
32
- /**
33
- * Combine abort signals into one that aborts as soon as any input aborts.
34
- * `undefined` inputs are skipped, so a caller can pass an optional caller-signal
35
- * alongside a required per-attempt one. Returns the sole signal when only one is
36
- * present (no wrapper), or `undefined` when none are.
37
- *
38
- * Prefers the platform `AbortSignal.any`, which cleans up its listeners via weak
39
- * refs — so merging onto a long-lived caller signal that's reused across many
40
- * calls can't accumulate listeners. Falls back to a manual controller on older
41
- * runtimes (< Node 20.3); there the listeners live until a source aborts or is
42
- * garbage-collected, which is fine for the usual per-request signal.
43
- */
44
- export declare function combineAbortSignals(...signals: Array<AbortSignal | undefined>): AbortSignal | undefined;
45
- export declare const withTimeoutAndRetry: <T>(operation: (signal: AbortSignal) => Promise<T>, timeoutMs?: number, maxRetries?: number, operationName?: string, isRetriable?: (error: unknown) => boolean) => Promise<T>;
46
- export interface StreamRetryOptions {
47
- /** Maximum number of retries after the first attempt. Defaults to 3. */
48
- maxRetries?: number;
49
- /** Backoff before the next attempt, in ms. Defaults to capped exponential. */
50
- delay?: (attempt: number) => number;
51
- /** Label used in retry logs. */
52
- operationName?: string;
53
- /**
54
- * Predicate deciding whether a pre-first-chunk failure may be retried.
55
- * When it returns `false` the error propagates immediately. Post-first-chunk
56
- * failures are never retried regardless (the stream is already committed).
57
- */
58
- isRetriable?: (error: unknown) => boolean;
59
- /**
60
- * Max ms to wait for the *first* chunk (time-to-first-token) before treating
61
- * the attempt as failed. Guards a provider that opens a stream and then
62
- * stalls. Only the first chunk is bounded — later chunks are unbounded so a
63
- * long but healthy stream is never cut off. `0`/omitted disables the deadline.
64
- */
65
- firstChunkTimeoutMs?: number;
66
- }
67
- /**
68
- * Streaming analog of {@link withTimeoutAndRetry}. Re-runs an async-generator
69
- * factory as long as it fails *before yielding its first chunk* — an empty
70
- * completion that throws "No response", an error while establishing the stream,
71
- * or (with `firstChunkTimeoutMs`) a stall before the first token. Once any chunk
72
- * has been yielded the stream is committed and further errors propagate, so a
73
- * retry can never double-emit deltas the consumer has already received.
74
- *
75
- * This mirrors the non-streaming path, where the provider throws on an empty
76
- * completion inside `withTimeoutAndRetry` and is retried on the same model
77
- * before the caller falls through to backup models.
78
- */
79
- export declare function withStreamRetry<T>(factory: (signal: AbortSignal) => AsyncGenerator<T>, options?: StreamRetryOptions): AsyncGenerator<T>;
80
- /**
81
- * Inputs shared by {@link withBackupFallback} and {@link streamWithBackupFallback}.
82
- *
83
- * The walkers own only control flow: which model runs next and when the walk
84
- * gives up. Logging and terminal-error wrapping stay with the caller (via the
85
- * callbacks and a try/catch around the call), so each provider keeps its exact
86
- * log prefixes, classification options and error normalization.
87
- */
88
- export interface BackupFallbackBase {
89
- /**
90
- * Models to try in order: `[primaryModel, ...backupModels]`. The first
91
- * successful attempt wins; every failure advances (or stops) the walk.
92
- */
93
- models: string[];
94
- /**
95
- * Predicate deciding whether a failure may fall through to the remaining
96
- * models. Returning `false` stops the walk and rethrows the error — a
97
- * deterministic failure (auth, invalid request) would hit identically on
98
- * every backup. Must be a pure classifier: it may be evaluated more than
99
- * once per error (the failure callback recomputes it to annotate logs).
100
- */
101
- shouldTryBackup: (error: unknown) => boolean;
102
- /**
103
- * Called once per failed model, before the backup decision is applied.
104
- * `attemptNo` is the 1-based position in `models` (`1` = primary) and
105
- * `total` is `models.length`, so callers can distinguish the primary
106
- * failure and tell whether any model remains after this one
107
- * (`attemptNo < total`).
108
- */
109
- onModelFailed?: (model: string, error: unknown, attemptNo: number, total: number) => void;
110
- /**
111
- * Called before each *backup* attempt (position > 0). `backupNo` and
112
- * `backupTotal` count backups only (`1..models.length - 1`), matching the
113
- * historical "Trying backup model 1/2: …" log shape.
114
- */
115
- onBackupStart?: (model: string, backupNo: number, backupTotal: number) => void;
116
- /** Called when a backup succeeds, just before its result is returned/yielded. */
117
- onBackupSucceeded?: (model: string) => void;
118
- }
119
- export interface BackupFallbackOptions<T> extends BackupFallbackBase {
120
- /** Run one model. A rejection marks the model failed; the resolved value wins. */
121
- attempt: (model: string) => Promise<T>;
122
- }
123
- export interface StreamBackupFallbackOptions<T> extends BackupFallbackBase {
124
- /** Produce one model's chunk stream; consumed lazily via `yield*`. */
125
- attempt: (model: string) => AsyncGenerator<T>;
126
- }
127
- /**
128
- * Try `models[0]` (the primary); on failure, if `shouldTryBackup` allows,
129
- * walk the remaining backup models in order. Resolves with the first
130
- * successful result; otherwise rethrows the last error seen. Errors are
131
- * rethrown untouched — wrap them at the call site.
132
- *
133
- * Streaming twin: {@link streamWithBackupFallback}.
134
- */
135
- export declare function withBackupFallback<T>(opts: BackupFallbackOptions<T>): Promise<T>;
136
- /**
137
- * Streaming twin of {@link withBackupFallback}: same walk, consuming each
138
- * model's chunk stream lazily via `yield*` so chunks flow through unchanged.
139
- * A stream that errors before completion counts as that model's failure and
140
- * the walk proceeds exactly as in the non-streaming case.
141
- */
142
- export declare function streamWithBackupFallback<T>(opts: StreamBackupFallbackOptions<T>): AsyncGenerator<T>;
143
- /**
144
- * Standard logging observer for the backup-fallback walkers. Holds the
145
- * per-walk state (primary error message, whether backups were tried) that the
146
- * terminal "All models failed" log needs, so each provider call site is just
147
- * `attempt` + `shouldTryBackup` + its own terminal error wrap.
148
- *
149
- * ```ts
150
- * const observer = backupFallbackLogging("[OPENAI]", shouldUseBackupModel);
151
- * try {
152
- * return await withBackupFallback({ models, attempt, shouldTryBackup, ...observer.callbacks });
153
- * } catch (error) {
154
- * observer.logExhausted(error);
155
- * throw wrap(error);
156
- * }
157
- * ```
158
- */
159
- export declare function backupFallbackLogging(label: string, shouldTryBackup: (error: unknown) => boolean, options?: {
160
- streaming?: boolean;
161
- }): {
162
- callbacks: Pick<BackupFallbackBase, "onModelFailed" | "onBackupStart" | "onBackupSucceeded">;
163
- logExhausted: (lastError: unknown) => void;
164
- };
165
- //# sourceMappingURL=retry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"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"}
@@ -1,338 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.withTimeoutAndRetry = void 0;
4
- exports.resolveRetryConfig = resolveRetryConfig;
5
- exports.retry = retry;
6
- exports.combineAbortSignals = combineAbortSignals;
7
- exports.withStreamRetry = withStreamRetry;
8
- exports.withBackupFallback = withBackupFallback;
9
- exports.streamWithBackupFallback = streamWithBackupFallback;
10
- exports.backupFallbackLogging = backupFallbackLogging;
11
- /**
12
- * Retry utility with exponential backoff
13
- */
14
- const logger_1 = require("./logger");
15
- const errorClassification_1 = require("../providers/errorClassification");
16
- const DEFAULT_RETRY_CONFIG = {
17
- timeout: 60000,
18
- retries: 3,
19
- };
20
- /**
21
- * Normalize a provider's optional retry config against the defaults. `timeout`
22
- * uses `||` (a 0ms timeout is degenerate — it aborts every call immediately — so
23
- * fall back to the default), while `retries` uses `??` so an explicit
24
- * `retries: 0` (disable retries) is honored rather than treated as unset. Single
25
- * definition so this distinction can't drift between providers.
26
- */
27
- function resolveRetryConfig(input) {
28
- return {
29
- timeout: input?.timeout || DEFAULT_RETRY_CONFIG.timeout,
30
- retries: input?.retries ?? DEFAULT_RETRY_CONFIG.retries,
31
- };
32
- }
33
- async function retry(options) {
34
- const { operation, maxRetries, delay, onRetry, onFailure, isRetriable } = options;
35
- let lastError;
36
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
37
- try {
38
- return await operation();
39
- }
40
- catch (error) {
41
- lastError = error;
42
- // Unretriable errors (auth, invalid request, caller aborts) fail fast —
43
- // retrying a deterministic failure only adds latency to the same outcome.
44
- if (isRetriable && !isRetriable(error)) {
45
- throw error;
46
- }
47
- if (attempt === maxRetries) {
48
- const shouldRethrow = onFailure ? onFailure(lastError) : true;
49
- if (shouldRethrow) {
50
- throw lastError;
51
- }
52
- break;
53
- }
54
- if (onRetry) {
55
- onRetry(attempt, lastError);
56
- }
57
- const delayMs = delay(attempt);
58
- await new Promise((resolve) => setTimeout(resolve, delayMs));
59
- }
60
- }
61
- // eslint-disable-next-line @typescript-eslint/only-throw-error
62
- throw lastError ?? new Error("Operation failed");
63
- }
64
- /** Capped exponential backoff (1s, 2s, 4s, … max 5s) shared by the retry helpers. */
65
- const defaultBackoff = (attempt) => Math.min(1000 * Math.pow(2, attempt), 5000);
66
- /**
67
- * Combine abort signals into one that aborts as soon as any input aborts.
68
- * `undefined` inputs are skipped, so a caller can pass an optional caller-signal
69
- * alongside a required per-attempt one. Returns the sole signal when only one is
70
- * present (no wrapper), or `undefined` when none are.
71
- *
72
- * Prefers the platform `AbortSignal.any`, which cleans up its listeners via weak
73
- * refs — so merging onto a long-lived caller signal that's reused across many
74
- * calls can't accumulate listeners. Falls back to a manual controller on older
75
- * runtimes (< Node 20.3); there the listeners live until a source aborts or is
76
- * garbage-collected, which is fine for the usual per-request signal.
77
- */
78
- function combineAbortSignals(...signals) {
79
- const present = signals.filter((s) => s != null);
80
- if (present.length <= 1)
81
- return present[0];
82
- if (typeof AbortSignal.any === "function")
83
- return AbortSignal.any(present);
84
- const controller = new AbortController();
85
- for (const signal of present) {
86
- if (signal.aborted) {
87
- controller.abort(signal.reason);
88
- break;
89
- }
90
- signal.addEventListener("abort", () => controller.abort(signal.reason), {
91
- once: true,
92
- });
93
- }
94
- return controller.signal;
95
- }
96
- const withTimeoutAndRetry = async (operation, timeoutMs = 60000, maxRetries = 3, operationName = "AI operation", isRetriable) => {
97
- const createTimeoutOperation = () => async () => {
98
- const controller = new AbortController();
99
- const timeoutId = setTimeout(() => {
100
- controller.abort();
101
- }, timeoutMs);
102
- try {
103
- // Hand the operation the timeout signal so the in-flight upstream call is
104
- // actually cancelled when the deadline fires — otherwise the abandoned
105
- // attempt keeps running while the retry stacks a second concurrent call.
106
- const result = await Promise.race([
107
- operation(controller.signal),
108
- new Promise((_, reject) => {
109
- controller.signal.addEventListener("abort", () => {
110
- reject(new Error(`Operation timed out after ${timeoutMs}ms`));
111
- });
112
- }),
113
- ]);
114
- clearTimeout(timeoutId);
115
- return result;
116
- }
117
- catch (error) {
118
- clearTimeout(timeoutId);
119
- throw error;
120
- }
121
- };
122
- return retry({
123
- operation: createTimeoutOperation(),
124
- maxRetries,
125
- delay: defaultBackoff,
126
- isRetriable,
127
- onRetry: (attempt, error) => {
128
- const message = error instanceof Error ? error.message : String(error);
129
- logger_1.logger.error(`[${operationName}] Failed attempt ${attempt + 1}:`, message);
130
- const delay = defaultBackoff(attempt);
131
- logger_1.logger.debug(`[${operationName}] Retrying in ${delay}ms...`);
132
- logger_1.logger.debug(`[${operationName}] Attempt ${attempt + 2}/${maxRetries + 1}`);
133
- },
134
- onFailure: (_error) => {
135
- logger_1.logger.error(`[${operationName}] All ${maxRetries + 1} attempts failed`);
136
- return true;
137
- },
138
- });
139
- };
140
- exports.withTimeoutAndRetry = withTimeoutAndRetry;
141
- /** Reject if `next` hasn't settled within `timeoutMs`; always clears its timer. */
142
- function raceFirstChunk(next, timeoutMs, operationName) {
143
- let timer;
144
- const timeout = new Promise((_, reject) => {
145
- timer = setTimeout(() => reject(new Error(`[${operationName}] Stream timed out: no first chunk within ${timeoutMs}ms`)), timeoutMs);
146
- });
147
- return Promise.race([next, timeout]).finally(() => clearTimeout(timer));
148
- }
149
- /**
150
- * Streaming analog of {@link withTimeoutAndRetry}. Re-runs an async-generator
151
- * factory as long as it fails *before yielding its first chunk* — an empty
152
- * completion that throws "No response", an error while establishing the stream,
153
- * or (with `firstChunkTimeoutMs`) a stall before the first token. Once any chunk
154
- * has been yielded the stream is committed and further errors propagate, so a
155
- * retry can never double-emit deltas the consumer has already received.
156
- *
157
- * This mirrors the non-streaming path, where the provider throws on an empty
158
- * completion inside `withTimeoutAndRetry` and is retried on the same model
159
- * before the caller falls through to backup models.
160
- */
161
- async function* withStreamRetry(factory, options = {}) {
162
- const { maxRetries = 3, delay = defaultBackoff, operationName = "AI stream", firstChunkTimeoutMs, isRetriable, } = options;
163
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
164
- // One controller per attempt: aborting it on abandon cancels the upstream
165
- // SDK call so a retry can't stack a second concurrent stream.
166
- const controller = new AbortController();
167
- const iterator = factory(controller.signal);
168
- let yielded = false;
169
- let completed = false;
170
- try {
171
- // Drive the iterator by hand so the first chunk can be raced against a
172
- // deadline; for-await would give no hook for that.
173
- for (;;) {
174
- const result = !yielded && firstChunkTimeoutMs
175
- ? await raceFirstChunk(iterator.next(), firstChunkTimeoutMs, operationName)
176
- : await iterator.next();
177
- if (result.done) {
178
- completed = true;
179
- return;
180
- }
181
- yielded = true;
182
- yield result.value;
183
- }
184
- }
185
- catch (error) {
186
- // Unretriable errors (auth, invalid request, caller aborts) propagate
187
- // immediately — no backoff for a deterministic failure.
188
- if (isRetriable && !isRetriable(error)) {
189
- throw error;
190
- }
191
- // Can't retry once deltas are out, and don't retry past the budget.
192
- if (yielded || attempt === maxRetries) {
193
- throw error;
194
- }
195
- const message = error instanceof Error ? error.message : String(error);
196
- logger_1.logger.error(`[${operationName}] Failed attempt ${attempt + 1}:`, message);
197
- const delayMs = delay(attempt);
198
- logger_1.logger.debug(`[${operationName}] Retrying in ${delayMs}ms... (attempt ${attempt + 2}/${maxRetries + 1})`);
199
- await new Promise((resolve) => setTimeout(resolve, delayMs));
200
- }
201
- finally {
202
- // Abandoning an attempt (first-chunk timeout, pre-yield error before a
203
- // retry, or a consumer that breaks early): abort the upstream SDK call
204
- // first so it's actually torn down — not left running while we retry —
205
- // then dispose the iterator. Aborting also unblocks a stalled
206
- // iterator.next() so return() can run the generator's cleanup. Both are
207
- // fire-and-forget: a wedged generator's return() may never settle, so we
208
- // must not await it.
209
- if (!completed) {
210
- controller.abort();
211
- void iterator.return?.(undefined)?.catch(() => undefined);
212
- }
213
- }
214
- }
215
- }
216
- /**
217
- * Try `models[0]` (the primary); on failure, if `shouldTryBackup` allows,
218
- * walk the remaining backup models in order. Resolves with the first
219
- * successful result; otherwise rethrows the last error seen. Errors are
220
- * rethrown untouched — wrap them at the call site.
221
- *
222
- * Streaming twin: {@link streamWithBackupFallback}.
223
- */
224
- async function withBackupFallback(opts) {
225
- const { models, attempt, shouldTryBackup, onModelFailed, onBackupStart, onBackupSucceeded, } = opts;
226
- if (models.length === 0) {
227
- throw new Error("withBackupFallback: `models` must include a primary model");
228
- }
229
- let lastError;
230
- for (let i = 0; i < models.length; i++) {
231
- const model = models[i];
232
- if (i > 0)
233
- onBackupStart?.(model, i, models.length - 1);
234
- try {
235
- const result = await attempt(model);
236
- if (i > 0)
237
- onBackupSucceeded?.(model);
238
- return result;
239
- }
240
- catch (error) {
241
- lastError = error;
242
- onModelFailed?.(model, error, i + 1, models.length);
243
- // A failure that doesn't qualify for backup ends the walk — the
244
- // remaining models would hit the same deterministic error. Falling
245
- // through to the throw covers both this early exit and exhaustion.
246
- if (!shouldTryBackup(error))
247
- break;
248
- }
249
- }
250
- throw lastError;
251
- }
252
- /**
253
- * Streaming twin of {@link withBackupFallback}: same walk, consuming each
254
- * model's chunk stream lazily via `yield*` so chunks flow through unchanged.
255
- * A stream that errors before completion counts as that model's failure and
256
- * the walk proceeds exactly as in the non-streaming case.
257
- */
258
- async function* streamWithBackupFallback(opts) {
259
- const { models, attempt, shouldTryBackup, onModelFailed, onBackupStart, onBackupSucceeded, } = opts;
260
- if (models.length === 0) {
261
- throw new Error("streamWithBackupFallback: `models` must include a primary model");
262
- }
263
- let lastError;
264
- for (let i = 0; i < models.length; i++) {
265
- const model = models[i];
266
- if (i > 0)
267
- onBackupStart?.(model, i, models.length - 1);
268
- try {
269
- yield* attempt(model);
270
- if (i > 0)
271
- onBackupSucceeded?.(model);
272
- return;
273
- }
274
- catch (error) {
275
- lastError = error;
276
- onModelFailed?.(model, error, i + 1, models.length);
277
- if (!shouldTryBackup(error))
278
- break;
279
- }
280
- }
281
- throw lastError;
282
- }
283
- /**
284
- * Standard logging observer for the backup-fallback walkers. Holds the
285
- * per-walk state (primary error message, whether backups were tried) that the
286
- * terminal "All models failed" log needs, so each provider call site is just
287
- * `attempt` + `shouldTryBackup` + its own terminal error wrap.
288
- *
289
- * ```ts
290
- * const observer = backupFallbackLogging("[OPENAI]", shouldUseBackupModel);
291
- * try {
292
- * return await withBackupFallback({ models, attempt, shouldTryBackup, ...observer.callbacks });
293
- * } catch (error) {
294
- * observer.logExhausted(error);
295
- * throw wrap(error);
296
- * }
297
- * ```
298
- */
299
- function backupFallbackLogging(label, shouldTryBackup, options) {
300
- let primaryErrMsg = "";
301
- // Records that the primary failed but qualified for backups — the only path
302
- // that reaches the "All models failed" terminal log; an ineligible primary
303
- // rethrows directly.
304
- let tryingBackups = false;
305
- const streamSuffix = options?.streaming ? " for streaming" : "";
306
- return {
307
- callbacks: {
308
- onModelFailed: (model, error, attemptNo, total) => {
309
- const errMsg = (0, errorClassification_1.getErrorMessage)(error);
310
- if (attemptNo === 1) {
311
- primaryErrMsg = errMsg;
312
- logger_1.logger.warn(`${label} Primary model ${model} failed: ${errMsg}`);
313
- if (shouldTryBackup(error)) {
314
- tryingBackups = true;
315
- logger_1.logger.debug(`${label} Trying backup models${streamSuffix}`);
316
- }
317
- return;
318
- }
319
- logger_1.logger.warn(`${label} Backup model ${model} failed: ${errMsg}`);
320
- if (!shouldTryBackup(error) && attemptNo < total) {
321
- logger_1.logger.debug(`${label} Backup model error doesn't qualify for further attempts`);
322
- }
323
- },
324
- onBackupStart: (model, backupNo, backupTotal) => {
325
- logger_1.logger.debug(`${label} Trying backup model ${backupNo}/${backupTotal}: ${model}`);
326
- },
327
- onBackupSucceeded: (model) => {
328
- logger_1.logger.debug(`${label} Backup model ${model} succeeded`);
329
- },
330
- },
331
- logExhausted: (lastError) => {
332
- if (tryingBackups) {
333
- logger_1.logger.error(`${label} All models failed. Primary: ${primaryErrMsg}, Last backup: ${(0, errorClassification_1.getErrorMessage)(lastError)}`);
334
- }
335
- },
336
- };
337
- }
338
- //# sourceMappingURL=retry.js.map