@falai/agent 2.2.3 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
  3. package/dist/adapters/MemoryAdapter.js +10 -1
  4. package/dist/adapters/MemoryAdapter.js.map +1 -1
  5. package/dist/adapters/MongoAdapter.d.ts.map +1 -1
  6. package/dist/adapters/MongoAdapter.js +33 -2
  7. package/dist/adapters/MongoAdapter.js.map +1 -1
  8. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  9. package/dist/adapters/OpenSearchAdapter.js +15 -1
  10. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  12. package/dist/adapters/PostgreSQLAdapter.js +35 -5
  13. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  14. package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
  15. package/dist/adapters/PrismaAdapter.js +58 -15
  16. package/dist/adapters/PrismaAdapter.js.map +1 -1
  17. package/dist/adapters/RedisAdapter.d.ts.map +1 -1
  18. package/dist/adapters/RedisAdapter.js +10 -1
  19. package/dist/adapters/RedisAdapter.js.map +1 -1
  20. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  21. package/dist/adapters/SQLiteAdapter.js +38 -6
  22. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
  24. package/dist/cjs/adapters/MemoryAdapter.js +10 -1
  25. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  26. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
  27. package/dist/cjs/adapters/MongoAdapter.js +33 -2
  28. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  29. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/OpenSearchAdapter.js +15 -1
  31. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  33. package/dist/cjs/adapters/PostgreSQLAdapter.js +35 -5
  34. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  35. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
  36. package/dist/cjs/adapters/PrismaAdapter.js +58 -15
  37. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  38. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
  39. package/dist/cjs/adapters/RedisAdapter.js +10 -1
  40. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  41. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  42. package/dist/cjs/adapters/SQLiteAdapter.js +38 -6
  43. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +28 -18
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +58 -68
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
  49. package/dist/cjs/core/AutoChainExecutor.js +14 -20
  50. package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
  51. package/dist/cjs/core/BranchEvaluator.d.ts +4 -3
  52. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
  53. package/dist/cjs/core/BranchEvaluator.js +18 -23
  54. package/dist/cjs/core/BranchEvaluator.js.map +1 -1
  55. package/dist/cjs/core/Flow.d.ts +2 -1
  56. package/dist/cjs/core/Flow.d.ts.map +1 -1
  57. package/dist/cjs/core/Flow.js +10 -3
  58. package/dist/cjs/core/Flow.js.map +1 -1
  59. package/dist/cjs/core/FlowRouter.d.ts +1 -0
  60. package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
  61. package/dist/cjs/core/FlowRouter.js +28 -5
  62. package/dist/cjs/core/FlowRouter.js.map +1 -1
  63. package/dist/cjs/core/PersistenceManager.d.ts +3 -0
  64. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  65. package/dist/cjs/core/PersistenceManager.js +57 -5
  66. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  67. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  68. package/dist/cjs/core/PromptComposer.js +24 -10
  69. package/dist/cjs/core/PromptComposer.js.map +1 -1
  70. package/dist/cjs/core/ResponseGenerationError.d.ts +30 -0
  71. package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -0
  72. package/dist/cjs/core/ResponseGenerationError.js +37 -0
  73. package/dist/cjs/core/ResponseGenerationError.js.map +1 -0
  74. package/dist/cjs/core/ResponseModal.d.ts +43 -96
  75. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  76. package/dist/cjs/core/ResponseModal.js +184 -1183
  77. package/dist/cjs/core/ResponseModal.js.map +1 -1
  78. package/dist/cjs/core/ResponsePipeline.d.ts +58 -152
  79. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  80. package/dist/cjs/core/ResponsePipeline.js +408 -457
  81. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  82. package/dist/cjs/core/SessionFinalizer.d.ts +34 -0
  83. package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -0
  84. package/dist/cjs/core/SessionFinalizer.js +61 -0
  85. package/dist/cjs/core/SessionFinalizer.js.map +1 -0
  86. package/dist/cjs/core/SessionManager.d.ts +1 -1
  87. package/dist/cjs/core/SessionManager.d.ts.map +1 -1
  88. package/dist/cjs/core/SessionManager.js +18 -7
  89. package/dist/cjs/core/SessionManager.js.map +1 -1
  90. package/dist/cjs/core/SignalCoordinator.d.ts +103 -0
  91. package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -0
  92. package/dist/cjs/core/SignalCoordinator.js +207 -0
  93. package/dist/cjs/core/SignalCoordinator.js.map +1 -0
  94. package/dist/cjs/core/SignalEvaluator.d.ts +2 -2
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
  96. package/dist/cjs/core/SignalEvaluator.js +13 -27
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -1
  98. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
  99. package/dist/cjs/core/SignalProcessor.js +1 -3
  100. package/dist/cjs/core/SignalProcessor.js.map +1 -1
  101. package/dist/cjs/core/Step.d.ts +3 -1
  102. package/dist/cjs/core/Step.d.ts.map +1 -1
  103. package/dist/cjs/core/Step.js +10 -3
  104. package/dist/cjs/core/Step.js.map +1 -1
  105. package/dist/cjs/core/StepLifecycle.d.ts +33 -0
  106. package/dist/cjs/core/StepLifecycle.d.ts.map +1 -0
  107. package/dist/cjs/core/StepLifecycle.js +97 -0
  108. package/dist/cjs/core/StepLifecycle.js.map +1 -0
  109. package/dist/cjs/core/ToolLoopExecutor.d.ts +104 -0
  110. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -0
  111. package/dist/cjs/core/ToolLoopExecutor.js +391 -0
  112. package/dist/cjs/core/ToolLoopExecutor.js.map +1 -0
  113. package/dist/cjs/core/ToolManager.d.ts +1 -1
  114. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  115. package/dist/cjs/core/ToolManager.js.map +1 -1
  116. package/dist/cjs/index.d.ts +4 -5
  117. package/dist/cjs/index.d.ts.map +1 -1
  118. package/dist/cjs/index.js +7 -6
  119. package/dist/cjs/index.js.map +1 -1
  120. package/dist/cjs/providers/AnthropicProvider.d.ts +2 -0
  121. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  122. package/dist/cjs/providers/AnthropicProvider.js +28 -56
  123. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  124. package/dist/cjs/providers/DeepSeekProvider.d.ts +25 -21
  125. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  126. package/dist/cjs/providers/DeepSeekProvider.js +48 -407
  127. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  128. package/dist/cjs/providers/GeminiProvider.d.ts +2 -0
  129. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  130. package/dist/cjs/providers/GeminiProvider.js +27 -56
  131. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  132. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +129 -0
  133. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -0
  134. package/dist/cjs/providers/OpenAICompatibleProvider.js +485 -0
  135. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -0
  136. package/dist/cjs/providers/OpenAIProvider.d.ts +9 -28
  137. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  138. package/dist/cjs/providers/OpenAIProvider.js +23 -417
  139. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  140. package/dist/cjs/providers/OpenRouterProvider.d.ts +10 -27
  141. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  142. package/dist/cjs/providers/OpenRouterProvider.js +28 -417
  143. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  144. package/dist/cjs/providers/errorClassification.d.ts +61 -0
  145. package/dist/cjs/providers/errorClassification.d.ts.map +1 -0
  146. package/dist/cjs/providers/errorClassification.js +123 -0
  147. package/dist/cjs/providers/errorClassification.js.map +1 -0
  148. package/dist/cjs/providers/index.d.ts +4 -0
  149. package/dist/cjs/providers/index.d.ts.map +1 -1
  150. package/dist/cjs/providers/index.js +7 -1
  151. package/dist/cjs/providers/index.js.map +1 -1
  152. package/dist/cjs/types/agent.d.ts +2 -1
  153. package/dist/cjs/types/agent.d.ts.map +1 -1
  154. package/dist/cjs/types/ai.d.ts +20 -0
  155. package/dist/cjs/types/ai.d.ts.map +1 -1
  156. package/dist/cjs/types/errors.d.ts +33 -0
  157. package/dist/cjs/types/errors.d.ts.map +1 -1
  158. package/dist/cjs/types/errors.js +37 -1
  159. package/dist/cjs/types/errors.js.map +1 -1
  160. package/dist/cjs/types/flow.d.ts +10 -5
  161. package/dist/cjs/types/flow.d.ts.map +1 -1
  162. package/dist/cjs/types/history.d.ts +1 -1
  163. package/dist/cjs/types/history.d.ts.map +1 -1
  164. package/dist/cjs/types/index.d.ts +5 -4
  165. package/dist/cjs/types/index.d.ts.map +1 -1
  166. package/dist/cjs/types/index.js +3 -1
  167. package/dist/cjs/types/index.js.map +1 -1
  168. package/dist/cjs/types/persistence.d.ts +43 -2
  169. package/dist/cjs/types/persistence.d.ts.map +1 -1
  170. package/dist/cjs/types/session.d.ts +8 -0
  171. package/dist/cjs/types/session.d.ts.map +1 -1
  172. package/dist/cjs/types/signals.d.ts +21 -11
  173. package/dist/cjs/types/signals.d.ts.map +1 -1
  174. package/dist/cjs/types/template.d.ts +3 -1
  175. package/dist/cjs/types/template.d.ts.map +1 -1
  176. package/dist/cjs/types/tool.d.ts +4 -4
  177. package/dist/cjs/types/tool.d.ts.map +1 -1
  178. package/dist/cjs/utils/condition.d.ts +19 -0
  179. package/dist/cjs/utils/condition.d.ts.map +1 -1
  180. package/dist/cjs/utils/condition.js +86 -15
  181. package/dist/cjs/utils/condition.js.map +1 -1
  182. package/dist/cjs/utils/session.d.ts +1 -0
  183. package/dist/cjs/utils/session.d.ts.map +1 -1
  184. package/dist/cjs/utils/session.js +1 -0
  185. package/dist/cjs/utils/session.js.map +1 -1
  186. package/dist/core/Agent.d.ts +28 -18
  187. package/dist/core/Agent.d.ts.map +1 -1
  188. package/dist/core/Agent.js +58 -68
  189. package/dist/core/Agent.js.map +1 -1
  190. package/dist/core/AutoChainExecutor.d.ts.map +1 -1
  191. package/dist/core/AutoChainExecutor.js +14 -20
  192. package/dist/core/AutoChainExecutor.js.map +1 -1
  193. package/dist/core/BranchEvaluator.d.ts +4 -3
  194. package/dist/core/BranchEvaluator.d.ts.map +1 -1
  195. package/dist/core/BranchEvaluator.js +18 -23
  196. package/dist/core/BranchEvaluator.js.map +1 -1
  197. package/dist/core/Flow.d.ts +2 -1
  198. package/dist/core/Flow.d.ts.map +1 -1
  199. package/dist/core/Flow.js +10 -3
  200. package/dist/core/Flow.js.map +1 -1
  201. package/dist/core/FlowRouter.d.ts +1 -0
  202. package/dist/core/FlowRouter.d.ts.map +1 -1
  203. package/dist/core/FlowRouter.js +28 -5
  204. package/dist/core/FlowRouter.js.map +1 -1
  205. package/dist/core/PersistenceManager.d.ts +3 -0
  206. package/dist/core/PersistenceManager.d.ts.map +1 -1
  207. package/dist/core/PersistenceManager.js +58 -6
  208. package/dist/core/PersistenceManager.js.map +1 -1
  209. package/dist/core/PromptComposer.d.ts.map +1 -1
  210. package/dist/core/PromptComposer.js +24 -10
  211. package/dist/core/PromptComposer.js.map +1 -1
  212. package/dist/core/ResponseGenerationError.d.ts +30 -0
  213. package/dist/core/ResponseGenerationError.d.ts.map +1 -0
  214. package/dist/core/ResponseGenerationError.js +33 -0
  215. package/dist/core/ResponseGenerationError.js.map +1 -0
  216. package/dist/core/ResponseModal.d.ts +43 -96
  217. package/dist/core/ResponseModal.d.ts.map +1 -1
  218. package/dist/core/ResponseModal.js +177 -1175
  219. package/dist/core/ResponseModal.js.map +1 -1
  220. package/dist/core/ResponsePipeline.d.ts +58 -152
  221. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  222. package/dist/core/ResponsePipeline.js +409 -458
  223. package/dist/core/ResponsePipeline.js.map +1 -1
  224. package/dist/core/SessionFinalizer.d.ts +34 -0
  225. package/dist/core/SessionFinalizer.d.ts.map +1 -0
  226. package/dist/core/SessionFinalizer.js +57 -0
  227. package/dist/core/SessionFinalizer.js.map +1 -0
  228. package/dist/core/SessionManager.d.ts +1 -1
  229. package/dist/core/SessionManager.d.ts.map +1 -1
  230. package/dist/core/SessionManager.js +18 -7
  231. package/dist/core/SessionManager.js.map +1 -1
  232. package/dist/core/SignalCoordinator.d.ts +103 -0
  233. package/dist/core/SignalCoordinator.d.ts.map +1 -0
  234. package/dist/core/SignalCoordinator.js +203 -0
  235. package/dist/core/SignalCoordinator.js.map +1 -0
  236. package/dist/core/SignalEvaluator.d.ts +2 -2
  237. package/dist/core/SignalEvaluator.d.ts.map +1 -1
  238. package/dist/core/SignalEvaluator.js +13 -27
  239. package/dist/core/SignalEvaluator.js.map +1 -1
  240. package/dist/core/SignalProcessor.d.ts.map +1 -1
  241. package/dist/core/SignalProcessor.js +1 -3
  242. package/dist/core/SignalProcessor.js.map +1 -1
  243. package/dist/core/Step.d.ts +3 -1
  244. package/dist/core/Step.d.ts.map +1 -1
  245. package/dist/core/Step.js +10 -3
  246. package/dist/core/Step.js.map +1 -1
  247. package/dist/core/StepLifecycle.d.ts +33 -0
  248. package/dist/core/StepLifecycle.d.ts.map +1 -0
  249. package/dist/core/StepLifecycle.js +93 -0
  250. package/dist/core/StepLifecycle.js.map +1 -0
  251. package/dist/core/ToolLoopExecutor.d.ts +104 -0
  252. package/dist/core/ToolLoopExecutor.d.ts.map +1 -0
  253. package/dist/core/ToolLoopExecutor.js +387 -0
  254. package/dist/core/ToolLoopExecutor.js.map +1 -0
  255. package/dist/core/ToolManager.d.ts +1 -1
  256. package/dist/core/ToolManager.d.ts.map +1 -1
  257. package/dist/core/ToolManager.js.map +1 -1
  258. package/dist/index.d.ts +4 -5
  259. package/dist/index.d.ts.map +1 -1
  260. package/dist/index.js +3 -3
  261. package/dist/index.js.map +1 -1
  262. package/dist/providers/AnthropicProvider.d.ts +2 -0
  263. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  264. package/dist/providers/AnthropicProvider.js +22 -50
  265. package/dist/providers/AnthropicProvider.js.map +1 -1
  266. package/dist/providers/DeepSeekProvider.d.ts +25 -21
  267. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  268. package/dist/providers/DeepSeekProvider.js +49 -408
  269. package/dist/providers/DeepSeekProvider.js.map +1 -1
  270. package/dist/providers/GeminiProvider.d.ts +2 -0
  271. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  272. package/dist/providers/GeminiProvider.js +21 -50
  273. package/dist/providers/GeminiProvider.js.map +1 -1
  274. package/dist/providers/OpenAICompatibleProvider.d.ts +129 -0
  275. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -0
  276. package/dist/providers/OpenAICompatibleProvider.js +481 -0
  277. package/dist/providers/OpenAICompatibleProvider.js.map +1 -0
  278. package/dist/providers/OpenAIProvider.d.ts +9 -28
  279. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  280. package/dist/providers/OpenAIProvider.js +23 -417
  281. package/dist/providers/OpenAIProvider.js.map +1 -1
  282. package/dist/providers/OpenRouterProvider.d.ts +10 -27
  283. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  284. package/dist/providers/OpenRouterProvider.js +28 -417
  285. package/dist/providers/OpenRouterProvider.js.map +1 -1
  286. package/dist/providers/errorClassification.d.ts +61 -0
  287. package/dist/providers/errorClassification.d.ts.map +1 -0
  288. package/dist/providers/errorClassification.js +116 -0
  289. package/dist/providers/errorClassification.js.map +1 -0
  290. package/dist/providers/index.d.ts +4 -0
  291. package/dist/providers/index.d.ts.map +1 -1
  292. package/dist/providers/index.js +2 -0
  293. package/dist/providers/index.js.map +1 -1
  294. package/dist/types/agent.d.ts +2 -1
  295. package/dist/types/agent.d.ts.map +1 -1
  296. package/dist/types/ai.d.ts +20 -0
  297. package/dist/types/ai.d.ts.map +1 -1
  298. package/dist/types/errors.d.ts +33 -0
  299. package/dist/types/errors.d.ts.map +1 -1
  300. package/dist/types/errors.js +34 -0
  301. package/dist/types/errors.js.map +1 -1
  302. package/dist/types/flow.d.ts +10 -5
  303. package/dist/types/flow.d.ts.map +1 -1
  304. package/dist/types/history.d.ts +1 -1
  305. package/dist/types/history.d.ts.map +1 -1
  306. package/dist/types/index.d.ts +5 -4
  307. package/dist/types/index.d.ts.map +1 -1
  308. package/dist/types/index.js +1 -1
  309. package/dist/types/index.js.map +1 -1
  310. package/dist/types/persistence.d.ts +43 -2
  311. package/dist/types/persistence.d.ts.map +1 -1
  312. package/dist/types/session.d.ts +8 -0
  313. package/dist/types/session.d.ts.map +1 -1
  314. package/dist/types/signals.d.ts +21 -11
  315. package/dist/types/signals.d.ts.map +1 -1
  316. package/dist/types/template.d.ts +3 -1
  317. package/dist/types/template.d.ts.map +1 -1
  318. package/dist/types/tool.d.ts +4 -4
  319. package/dist/types/tool.d.ts.map +1 -1
  320. package/dist/utils/condition.d.ts +19 -0
  321. package/dist/utils/condition.d.ts.map +1 -1
  322. package/dist/utils/condition.js +84 -15
  323. package/dist/utils/condition.js.map +1 -1
  324. package/dist/utils/session.d.ts +1 -0
  325. package/dist/utils/session.d.ts.map +1 -1
  326. package/dist/utils/session.js +1 -0
  327. package/dist/utils/session.js.map +1 -1
  328. package/docs/README.md +1 -1
  329. package/docs/guides/branching.md +1 -1
  330. package/docs/guides/compaction.md +12 -5
  331. package/docs/guides/conditions.md +15 -2
  332. package/docs/guides/error-handling.md +59 -9
  333. package/docs/guides/instructions.md +2 -2
  334. package/docs/guides/persistence.md +69 -2
  335. package/docs/guides/streaming.md +3 -1
  336. package/docs/migration/README.md +5 -1
  337. package/docs/migration/v2-3-to-v2-4.md +316 -0
  338. package/docs/reference/adapters.md +55 -7
  339. package/docs/reference/branches.md +2 -2
  340. package/docs/reference/create-agent.md +3 -3
  341. package/docs/reference/errors.md +66 -1
  342. package/docs/reference/flow.md +1 -1
  343. package/docs/reference/instruction.md +4 -4
  344. package/docs/reference/providers.md +100 -3
  345. package/docs/reference/signals.md +18 -8
  346. package/docs/reference/step.md +2 -2
  347. package/docs/reference/tool.md +3 -1
  348. package/docs/start/05-go-to-production.md +3 -0
  349. package/package.json +1 -1
  350. package/src/adapters/MemoryAdapter.ts +15 -1
  351. package/src/adapters/MongoAdapter.ts +41 -2
  352. package/src/adapters/OpenSearchAdapter.ts +24 -1
  353. package/src/adapters/PostgreSQLAdapter.ts +45 -5
  354. package/src/adapters/PrismaAdapter.ts +82 -16
  355. package/src/adapters/RedisAdapter.ts +19 -1
  356. package/src/adapters/SQLiteAdapter.ts +47 -5
  357. package/src/core/Agent.ts +70 -85
  358. package/src/core/AutoChainExecutor.ts +27 -57
  359. package/src/core/BranchEvaluator.ts +24 -30
  360. package/src/core/Flow.ts +10 -3
  361. package/src/core/FlowRouter.ts +36 -4
  362. package/src/core/PersistenceManager.ts +79 -10
  363. package/src/core/PromptComposer.ts +25 -12
  364. package/src/core/ResponseGenerationError.ts +56 -0
  365. package/src/core/ResponseModal.ts +241 -1465
  366. package/src/core/ResponsePipeline.ts +492 -662
  367. package/src/core/SessionFinalizer.ts +78 -0
  368. package/src/core/SessionManager.ts +21 -9
  369. package/src/core/SignalCoordinator.ts +263 -0
  370. package/src/core/SignalEvaluator.ts +14 -30
  371. package/src/core/SignalProcessor.ts +1 -4
  372. package/src/core/Step.ts +11 -3
  373. package/src/core/StepLifecycle.ts +139 -0
  374. package/src/core/ToolLoopExecutor.ts +492 -0
  375. package/src/core/ToolManager.ts +2 -1
  376. package/src/index.ts +7 -5
  377. package/src/providers/AnthropicProvider.ts +30 -72
  378. package/src/providers/DeepSeekProvider.ts +74 -586
  379. package/src/providers/GeminiProvider.ts +29 -70
  380. package/src/providers/OpenAICompatibleProvider.ts +738 -0
  381. package/src/providers/OpenAIProvider.ts +29 -602
  382. package/src/providers/OpenRouterProvider.ts +38 -596
  383. package/src/providers/errorClassification.ts +172 -0
  384. package/src/providers/index.ts +13 -0
  385. package/src/types/agent.ts +2 -1
  386. package/src/types/ai.ts +22 -0
  387. package/src/types/errors.ts +57 -0
  388. package/src/types/flow.ts +10 -5
  389. package/src/types/history.ts +1 -2
  390. package/src/types/index.ts +5 -1
  391. package/src/types/persistence.ts +50 -2
  392. package/src/types/session.ts +9 -0
  393. package/src/types/signals.ts +23 -11
  394. package/src/types/template.ts +3 -1
  395. package/src/types/tool.ts +10 -10
  396. package/src/utils/condition.ts +115 -18
  397. package/src/utils/session.ts +2 -0
@@ -67,6 +67,7 @@ export interface BuildStepSelectionPromptParams<
67
67
  context?: TContext;
68
68
  session?: SessionState<TData>;
69
69
  stepConditionContext?: string[]; // AI context strings from step conditions
70
+ stepExclusionContext?: string[]; // AI exclusion strings from step conditions
70
71
  }
71
72
 
72
73
  export interface BuildRoutingPromptParams<TContext = unknown, TData = unknown> {
@@ -384,9 +385,11 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
384
385
 
385
386
  // Collect AI context strings from step conditions
386
387
  const stepConditionContext: string[] = [];
388
+ const stepExclusionContext: string[] = [];
387
389
  for (const candidate of candidates) {
388
390
  const whenResult = await candidate.step.evaluateWhen(templateContext);
389
391
  stepConditionContext.push(...whenResult.aiContextStrings);
392
+ stepExclusionContext.push(...whenResult.aiExclusionStrings);
390
393
  }
391
394
 
392
395
  // Check if any candidate is a completion marker (isFlowComplete = true)
@@ -403,6 +406,7 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
403
406
  context,
404
407
  session: updatedSession,
405
408
  stepConditionContext,
409
+ stepExclusionContext,
406
410
  includeCompletion: hasCompletionOption,
407
411
  });
408
412
 
@@ -1100,6 +1104,7 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
1100
1104
  context,
1101
1105
  session,
1102
1106
  stepConditionContext,
1107
+ stepExclusionContext,
1103
1108
  includeCompletion = false,
1104
1109
  } = params;
1105
1110
  const templateContext = createTemplateContext({ context, session, history });
@@ -1152,8 +1157,9 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
1152
1157
  const whenResult = await candidate.step.evaluateWhen(templateContext);
1153
1158
  if (whenResult.aiContextStrings.length > 0) {
1154
1159
  parts.push(` When any condition matches: ${whenResult.aiContextStrings.join(" OR ")}`);
1155
- } else if (typeof candidate.step.when === 'string') {
1156
- parts.push(` When this step should be completed: ${candidate.step.when}`);
1160
+ }
1161
+ if (whenResult.aiExclusionStrings.length > 0) {
1162
+ parts.push(` Do not choose when any condition matches: ${whenResult.aiExclusionStrings.join(" OR ")}`);
1157
1163
  }
1158
1164
  }
1159
1165
 
@@ -1185,6 +1191,18 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
1185
1191
  );
1186
1192
  }
1187
1193
 
1194
+ if (stepExclusionContext && stepExclusionContext.length > 0) {
1195
+ await pc.addInstruction(
1196
+ [
1197
+ "",
1198
+ "Additional step exclusion context:",
1199
+ ...stepExclusionContext.map(ctx => `- ${ctx}`),
1200
+ "",
1201
+ "Avoid selecting steps when their exclusion context matches.",
1202
+ ].join("\n")
1203
+ );
1204
+ }
1205
+
1188
1206
  // Add decision prompt
1189
1207
  const decisionRules = [
1190
1208
  "Task: Decide which step to transition to based on:",
@@ -1424,6 +1442,7 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
1424
1442
  "Available steps in active route (choose one to transition to):",
1425
1443
  ];
1426
1444
  const activeStepConditionContext: string[] = [];
1445
+ const activeStepExclusionContext: string[] = [];
1427
1446
 
1428
1447
  for (const step of activeFlowSteps) {
1429
1448
  const idx = activeFlowSteps.indexOf(step);
@@ -1438,8 +1457,10 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
1438
1457
  if (whenResult.aiContextStrings.length > 0) {
1439
1458
  stepInfo.push(` When any condition matches: ${whenResult.aiContextStrings.join(" OR ")}`);
1440
1459
  activeStepConditionContext.push(...whenResult.aiContextStrings);
1441
- } else if (typeof step.when === 'string') {
1442
- stepInfo.push(` When this step should be completed: ${step.when}`);
1460
+ }
1461
+ if (whenResult.aiExclusionStrings.length > 0) {
1462
+ stepInfo.push(` Do not choose when any condition matches: ${whenResult.aiExclusionStrings.join(" OR ")}`);
1463
+ activeStepExclusionContext.push(...whenResult.aiExclusionStrings);
1443
1464
  }
1444
1465
  }
1445
1466
 
@@ -1472,6 +1493,17 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
1472
1493
  ].join("\n")
1473
1494
  );
1474
1495
  }
1496
+ if (activeStepExclusionContext.length > 0) {
1497
+ await pc.addInstruction(
1498
+ [
1499
+ "",
1500
+ "Additional step exclusion context:",
1501
+ ...activeStepExclusionContext.map(ctx => `- ${ctx}`),
1502
+ "",
1503
+ "Avoid selecting steps when their exclusion context matches.",
1504
+ ].join("\n")
1505
+ );
1506
+ }
1475
1507
  }
1476
1508
  }
1477
1509
 
@@ -18,7 +18,8 @@ import type {
18
18
  PersistenceAdapter,
19
19
  CollectedStateData,
20
20
  } from "../types";
21
- import { createSession, sessionStepToData, sessionDataToStep } from "../utils";
21
+ import { createSession, sessionStepToData, sessionDataToStep, logger } from "../utils";
22
+ import { SessionConflictError } from "../types/errors";
22
23
  import { convertMessagesToHistory } from "./Events";
23
24
 
24
25
  /**
@@ -29,6 +30,8 @@ export class PersistenceManager<TData = Record<string, unknown>> {
29
30
  private config: PersistenceConfig<TData>;
30
31
  private sessionRepository: SessionRepository<TData>;
31
32
  private messageRepository: MessageRepository;
33
+ /** Per-session in-process save queue; see saveSessionState. */
34
+ private saveQueues = new Map<string, Promise<SessionData<TData> | null>>();
32
35
 
33
36
  constructor(config: PersistenceConfig<TData>) {
34
37
  this.config = {
@@ -233,6 +236,28 @@ export class PersistenceManager<TData = Record<string, unknown>> {
233
236
  async saveSessionState(
234
237
  sessionId: string,
235
238
  sessionStep: SessionState<TData>
239
+ ): Promise<SessionData<TData> | null> {
240
+ // Serialize same-process saves per session: concurrent saves of the same
241
+ // in-memory session would otherwise race the version compare-and-swap and
242
+ // spuriously conflict with each other. Cross-process conflicts (two
243
+ // independently loaded copies) still throw SessionConflictError.
244
+ const previous = this.saveQueues.get(sessionId) ?? Promise.resolve();
245
+ const run = previous
246
+ .catch(() => undefined)
247
+ .then(() => this.doSaveSessionState(sessionId, sessionStep));
248
+ this.saveQueues.set(sessionId, run);
249
+ try {
250
+ return await run;
251
+ } finally {
252
+ if (this.saveQueues.get(sessionId) === run) {
253
+ this.saveQueues.delete(sessionId);
254
+ }
255
+ }
256
+ }
257
+
258
+ private async doSaveSessionState(
259
+ sessionId: string,
260
+ sessionStep: SessionState<TData>
236
261
  ): Promise<SessionData<TData> | null> {
237
262
  // Validate input parameters
238
263
  if (!sessionId || typeof sessionId !== 'string') {
@@ -256,21 +281,31 @@ export class PersistenceManager<TData = Record<string, unknown>> {
256
281
  throw new Error(`Failed to convert session step to persistence data: ${errorMessage}`);
257
282
  }
258
283
 
284
+ // Stamp the configured schema version so loads can detect stale state
285
+ if (this.config.schemaVersion !== undefined) {
286
+ persistenceData.collectedData.schemaVersion = this.config.schemaVersion;
287
+ }
288
+
259
289
  try {
260
290
  // First try to find existing session
261
291
  const existingSession = await this.sessionRepository.findById(sessionId);
262
292
 
293
+ let saved: SessionData<TData> | null;
263
294
  if (existingSession) {
264
- // Update existing session
265
- return await this.sessionRepository.update(sessionId, {
266
- currentFlow: persistenceData.currentFlow,
267
- currentStep: persistenceData.currentStep,
268
- collectedData: persistenceData.collectedData,
269
- lastMessageAt: new Date(),
270
- });
295
+ // Compare-and-swap on the session's version: a concurrent writer
296
+ // bumped it since we loaded, the adapter throws SessionConflictError
297
+ saved = await this.sessionRepository.update(
298
+ sessionId,
299
+ {
300
+ currentFlow: persistenceData.currentFlow,
301
+ currentStep: persistenceData.currentStep,
302
+ collectedData: persistenceData.collectedData,
303
+ lastMessageAt: new Date(),
304
+ },
305
+ { expectedVersion: sessionStep.version }
306
+ );
271
307
  } else {
272
- // Create new session if it doesn't exist
273
- return await this.sessionRepository.create({
308
+ saved = await this.sessionRepository.create({
274
309
  id: sessionId,
275
310
  userId: persistenceData.collectedData.metadata?.userId
276
311
  ? JSON.stringify(persistenceData.collectedData.metadata?.userId)
@@ -280,9 +315,21 @@ export class PersistenceManager<TData = Record<string, unknown>> {
280
315
  currentStep: persistenceData.currentStep,
281
316
  collectedData: persistenceData.collectedData,
282
317
  messageCount: 0,
318
+ version: 1,
283
319
  });
284
320
  }
321
+
322
+ // Propagate the new version so the next save of this in-memory session
323
+ // passes the compare-and-swap
324
+ if (saved?.version !== undefined) {
325
+ sessionStep.version = saved.version;
326
+ }
327
+
328
+ return saved;
285
329
  } catch (error) {
330
+ if (error instanceof SessionConflictError) {
331
+ throw error;
332
+ }
286
333
  const errorMessage = error instanceof Error ? error.message : String(error);
287
334
  throw new Error(`Failed to save session state to persistence: ${errorMessage}`);
288
335
  }
@@ -301,6 +348,28 @@ export class PersistenceManager<TData = Record<string, unknown>> {
301
348
  return null;
302
349
  }
303
350
 
351
+ // Upgrade state written under an older user schema before reconstructing
352
+ if (
353
+ this.config.schemaVersion !== undefined &&
354
+ sessionData.collectedData &&
355
+ sessionData.collectedData.schemaVersion !== this.config.schemaVersion
356
+ ) {
357
+ const fromVersion = sessionData.collectedData.schemaVersion;
358
+ if (this.config.migrateSession) {
359
+ sessionData.collectedData = await this.config.migrateSession(
360
+ sessionData.collectedData,
361
+ fromVersion
362
+ );
363
+ sessionData.collectedData.schemaVersion = this.config.schemaVersion;
364
+ } else {
365
+ logger.warn(
366
+ `[PersistenceManager] Session "${sessionId}" was written with schemaVersion ` +
367
+ `${fromVersion ?? 'none'} but the agent is configured with ${this.config.schemaVersion}, ` +
368
+ `and no migrateSession is configured. Loading state as-is.`
369
+ );
370
+ }
371
+ }
372
+
304
373
  // Reconstruct SessionState from SessionData
305
374
  const sessionState = sessionDataToStep<TData>(sessionId, sessionData);
306
375
 
@@ -4,6 +4,7 @@ import { render, renderMany, formatKnowledgeBase, createTemplateContext } from "
4
4
  import { TemplateContext } from "../types/template";
5
5
  import { PromptSectionCache } from "./PromptSectionCache";
6
6
  import { logger } from "../utils";
7
+ import { splitWhenConditions } from "../utils/condition";
7
8
 
8
9
  export class PromptComposer<TContext = unknown, TData = unknown> {
9
10
  private parts: string[] = [];
@@ -209,10 +210,18 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
209
210
  if (!text) continue;
210
211
 
211
212
  const whenContextStrings = g.when
212
- ? (Array.isArray(g.when) ? g.when : [g.when])
213
- : [];
214
- const condition = whenContextStrings.length > 0
215
- ? ` (apply only when: ${whenContextStrings.join(" OR ")})`
213
+ ? splitWhenConditions(g.when)
214
+ : { positive: [], negative: [] };
215
+ const conditionParts = [
216
+ whenContextStrings.positive.length > 0
217
+ ? `apply only when: ${whenContextStrings.positive.join(" OR ")}`
218
+ : undefined,
219
+ whenContextStrings.negative.length > 0
220
+ ? `do not apply when: ${whenContextStrings.negative.join(" OR ")}`
221
+ : undefined,
222
+ ].filter((part): part is string => part !== undefined);
223
+ const condition = conditionParts.length > 0
224
+ ? ` (${conditionParts.join("; ")})`
216
225
  : "";
217
226
 
218
227
  lines.push(`- ${kindPrefix(g.kind)} ${caption} ${text}${condition}`);
@@ -333,14 +342,18 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
333
342
 
334
343
  const compute = (): string | null => {
335
344
  const renderedFlows = flows.map((r, i) => {
336
- // v2: `when` is string | string[] (AI-evaluated). Extract directly.
337
- const whenContextStrings: string[] = r.when
338
- ? (Array.isArray(r.when) ? r.when : [r.when])
339
- : [];
340
- const conditions =
341
- whenContextStrings.length > 0
342
- ? `\n\n **Triggered when:** ${whenContextStrings.join(" OR ")}`
343
- : "";
345
+ // v2: `when` is string | string[] (AI-evaluated). Split into positives and exclusions.
346
+ const whenContextStrings = r.when
347
+ ? splitWhenConditions(r.when)
348
+ : { positive: [], negative: [] };
349
+ const conditionParts: string[] = [];
350
+ if (whenContextStrings.positive.length > 0) {
351
+ conditionParts.push(`\n\n **Triggered when:** ${whenContextStrings.positive.join(" OR ")}`);
352
+ }
353
+ if (whenContextStrings.negative.length > 0) {
354
+ conditionParts.push(`\n\n **Do not trigger when:** ${whenContextStrings.negative.join(" OR ")}`);
355
+ }
356
+ const conditions = conditionParts.join("");
344
357
  const desc = r.description
345
358
  ? `\n\n **Description:** ${r.description}`
346
359
  : "";
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Error type for response-generation failures, shared by the response
3
+ * coordinator and its collaborators.
4
+ */
5
+
6
+ /**
7
+ * Error details for response generation failures
8
+ */
9
+ interface ResponseGenerationErrorDetails {
10
+ originalError?: unknown;
11
+ params?: Record<string, unknown>;
12
+ phase?: string;
13
+ context?: Record<string, unknown>;
14
+ }
15
+
16
+ /**
17
+ * Error class for response generation failures
18
+ */
19
+ export class ResponseGenerationError extends Error {
20
+ constructor(
21
+ message: string,
22
+ public readonly details?: ResponseGenerationErrorDetails
23
+ ) {
24
+ super(message);
25
+ this.name = 'ResponseGenerationError';
26
+
27
+ // Preserve stack trace from original error if available
28
+ if (details?.originalError instanceof Error && details.originalError.stack) {
29
+ this.stack = `${this.stack}\nCaused by: ${details.originalError.stack}`;
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Create a ResponseGenerationError from an unknown error
35
+ */
36
+ static fromError(
37
+ error: unknown,
38
+ phase: string,
39
+ params?: Record<string, unknown>,
40
+ context?: Record<string, unknown>
41
+ ): ResponseGenerationError {
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ return new ResponseGenerationError(
44
+ `[ResponseGenerationError] Response generation failed in ${phase}: ${message}. ` +
45
+ `Check provider configuration and the ${phase} phase handler.`,
46
+ { originalError: error, params, phase, context }
47
+ );
48
+ }
49
+
50
+ /**
51
+ * Check if an error is a ResponseGenerationError
52
+ */
53
+ static isResponseGenerationError(error: unknown): error is ResponseGenerationError {
54
+ return error instanceof ResponseGenerationError;
55
+ }
56
+ }