@falai/agent 2.6.1 → 3.0.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 (611) hide show
  1. package/README.md +2 -2
  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 +32 -36
  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 +18 -13
  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 +2 -1
  23. package/dist/adapters/RedisAdapter.d.ts.map +1 -1
  24. package/dist/adapters/RedisAdapter.js +77 -27
  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 +9 -31
  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 +22 -0
  35. package/dist/adapters/sessionRow.d.ts.map +1 -0
  36. package/dist/adapters/sessionRow.js +48 -0
  37. package/dist/adapters/sessionRow.js.map +1 -0
  38. package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
  39. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
  40. package/dist/cjs/adapters/MemoryAdapter.js +39 -43
  41. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  42. package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
  43. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
  44. package/dist/cjs/adapters/MongoAdapter.js +4 -4
  45. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  46. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +1 -1
  47. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  48. package/dist/cjs/adapters/OpenSearchAdapter.js +6 -6
  49. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  50. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
  51. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  52. package/dist/cjs/adapters/PostgreSQLAdapter.js +20 -15
  53. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  54. package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
  55. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
  56. package/dist/cjs/adapters/PrismaAdapter.js +7 -7
  57. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  58. package/dist/cjs/adapters/RedisAdapter.d.ts +2 -1
  59. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
  60. package/dist/cjs/adapters/RedisAdapter.js +81 -31
  61. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  62. package/dist/cjs/adapters/SQLiteAdapter.d.ts +1 -1
  63. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  64. package/dist/cjs/adapters/SQLiteAdapter.js +11 -33
  65. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  66. package/dist/cjs/adapters/index.d.ts +13 -13
  67. package/dist/cjs/adapters/index.d.ts.map +1 -1
  68. package/dist/cjs/adapters/index.js +14 -14
  69. package/dist/cjs/adapters/index.js.map +1 -1
  70. package/dist/cjs/adapters/sessionRow.d.ts +22 -0
  71. package/dist/cjs/adapters/sessionRow.d.ts.map +1 -0
  72. package/dist/cjs/adapters/sessionRow.js +52 -0
  73. package/dist/cjs/adapters/sessionRow.js.map +1 -0
  74. package/dist/cjs/core/Agent.d.ts +19 -11
  75. package/dist/cjs/core/Agent.d.ts.map +1 -1
  76. package/dist/cjs/core/Agent.js +102 -64
  77. package/dist/cjs/core/Agent.js.map +1 -1
  78. package/dist/cjs/core/AutoChainExecutor.d.ts +12 -22
  79. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
  80. package/dist/cjs/core/AutoChainExecutor.js +46 -49
  81. package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
  82. package/dist/cjs/core/BranchEvaluator.d.ts +4 -4
  83. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
  84. package/dist/cjs/core/BranchEvaluator.js +6 -6
  85. package/dist/cjs/core/BranchEvaluator.js.map +1 -1
  86. package/dist/cjs/core/CompactionEngine.d.ts +16 -3
  87. package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
  88. package/dist/cjs/core/CompactionEngine.js +30 -6
  89. package/dist/cjs/core/CompactionEngine.js.map +1 -1
  90. package/dist/cjs/core/DirectiveChainTracker.d.ts +1 -1
  91. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -1
  92. package/dist/cjs/core/DirectiveChainTracker.js +5 -5
  93. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -1
  94. package/dist/cjs/core/Events.d.ts +1 -1
  95. package/dist/cjs/core/Events.d.ts.map +1 -1
  96. package/dist/cjs/core/Events.js +15 -15
  97. package/dist/cjs/core/Events.js.map +1 -1
  98. package/dist/cjs/core/Flow.d.ts +4 -4
  99. package/dist/cjs/core/Flow.d.ts.map +1 -1
  100. package/dist/cjs/core/Flow.js +15 -15
  101. package/dist/cjs/core/Flow.js.map +1 -1
  102. package/dist/cjs/core/FlowRouter.d.ts +4 -4
  103. package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
  104. package/dist/cjs/core/FlowRouter.js +92 -70
  105. package/dist/cjs/core/FlowRouter.js.map +1 -1
  106. package/dist/cjs/core/PersistenceManager.d.ts +1 -1
  107. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  108. package/dist/cjs/core/PersistenceManager.js +10 -10
  109. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  110. package/dist/cjs/core/PromptComposer.d.ts +4 -4
  111. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  112. package/dist/cjs/core/PromptComposer.js +13 -13
  113. package/dist/cjs/core/PromptComposer.js.map +1 -1
  114. package/dist/cjs/core/PromptSectionCache.d.ts +2 -2
  115. package/dist/cjs/core/PromptSectionCache.d.ts.map +1 -1
  116. package/dist/cjs/core/ResponseEngine.d.ts +4 -4
  117. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  118. package/dist/cjs/core/ResponseEngine.js +7 -7
  119. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  120. package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -1
  121. package/dist/cjs/core/ResponseGenerationError.js +3 -5
  122. package/dist/cjs/core/ResponseGenerationError.js.map +1 -1
  123. package/dist/cjs/core/ResponseModal.d.ts +39 -10
  124. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  125. package/dist/cjs/core/ResponseModal.js +195 -72
  126. package/dist/cjs/core/ResponseModal.js.map +1 -1
  127. package/dist/cjs/core/ResponsePipeline.d.ts +50 -12
  128. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  129. package/dist/cjs/core/ResponsePipeline.js +301 -158
  130. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  131. package/dist/cjs/core/SessionFinalizer.d.ts +4 -4
  132. package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -1
  133. package/dist/cjs/core/SessionFinalizer.js +36 -9
  134. package/dist/cjs/core/SessionFinalizer.js.map +1 -1
  135. package/dist/cjs/core/SessionManager.d.ts +15 -6
  136. package/dist/cjs/core/SessionManager.d.ts.map +1 -1
  137. package/dist/cjs/core/SessionManager.js +49 -22
  138. package/dist/cjs/core/SessionManager.js.map +1 -1
  139. package/dist/cjs/core/SignalCoordinator.d.ts +5 -5
  140. package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -1
  141. package/dist/cjs/core/SignalCoordinator.js +12 -12
  142. package/dist/cjs/core/SignalCoordinator.js.map +1 -1
  143. package/dist/cjs/core/SignalEvaluator.d.ts +4 -4
  144. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
  145. package/dist/cjs/core/SignalEvaluator.js +6 -6
  146. package/dist/cjs/core/SignalEvaluator.js.map +1 -1
  147. package/dist/cjs/core/SignalProcessor.d.ts +6 -6
  148. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
  149. package/dist/cjs/core/SignalProcessor.js +17 -89
  150. package/dist/cjs/core/SignalProcessor.js.map +1 -1
  151. package/dist/cjs/core/Step.d.ts +5 -5
  152. package/dist/cjs/core/Step.d.ts.map +1 -1
  153. package/dist/cjs/core/Step.js +65 -17
  154. package/dist/cjs/core/Step.js.map +1 -1
  155. package/dist/cjs/core/StepLifecycle.d.ts +18 -8
  156. package/dist/cjs/core/StepLifecycle.d.ts.map +1 -1
  157. package/dist/cjs/core/StepLifecycle.js +103 -20
  158. package/dist/cjs/core/StepLifecycle.js.map +1 -1
  159. package/dist/cjs/core/StreamingToolExecutor.d.ts +1 -1
  160. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  161. package/dist/cjs/core/StreamingToolExecutor.js +30 -6
  162. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  163. package/dist/cjs/core/ToolLoopExecutor.d.ts +8 -4
  164. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -1
  165. package/dist/cjs/core/ToolLoopExecutor.js +189 -97
  166. package/dist/cjs/core/ToolLoopExecutor.js.map +1 -1
  167. package/dist/cjs/core/ToolManager.d.ts +6 -6
  168. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  169. package/dist/cjs/core/ToolManager.js +102 -79
  170. package/dist/cjs/core/ToolManager.js.map +1 -1
  171. package/dist/cjs/core/createAgent.d.ts +2 -2
  172. package/dist/cjs/core/createAgent.d.ts.map +1 -1
  173. package/dist/cjs/core/createAgent.js +2 -2
  174. package/dist/cjs/core/createAgent.js.map +1 -1
  175. package/dist/cjs/core/flow-namespace.d.ts +16 -1
  176. package/dist/cjs/core/flow-namespace.d.ts.map +1 -1
  177. package/dist/cjs/core/flow-namespace.js +26 -4
  178. package/dist/cjs/core/flow-namespace.js.map +1 -1
  179. package/dist/cjs/core/toolGates.d.ts +1 -1
  180. package/dist/cjs/core/toolGates.d.ts.map +1 -1
  181. package/dist/cjs/core/toolGates.js +3 -3
  182. package/dist/cjs/core/toolGates.js.map +1 -1
  183. package/dist/cjs/index.d.ts +50 -45
  184. package/dist/cjs/index.d.ts.map +1 -1
  185. package/dist/cjs/index.js +96 -88
  186. package/dist/cjs/index.js.map +1 -1
  187. package/dist/cjs/providers/AnthropicProvider.d.ts +25 -35
  188. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  189. package/dist/cjs/providers/AnthropicProvider.js +30 -426
  190. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  191. package/dist/cjs/providers/DeepSeekProvider.d.ts +13 -34
  192. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  193. package/dist/cjs/providers/DeepSeekProvider.js +17 -51
  194. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  195. package/dist/cjs/providers/GeminiProvider.d.ts +22 -75
  196. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  197. package/dist/cjs/providers/GeminiProvider.js +32 -558
  198. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  199. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  200. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  201. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js +14 -20
  202. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  203. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +26 -135
  204. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  205. package/dist/cjs/providers/OpenAICompatibleProvider.js +40 -496
  206. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  207. package/dist/cjs/providers/OpenAIProvider.d.ts +14 -20
  208. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  209. package/dist/cjs/providers/OpenAIProvider.js +21 -28
  210. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  211. package/dist/cjs/providers/OpenRouterProvider.d.ts +20 -24
  212. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  213. package/dist/cjs/providers/OpenRouterProvider.js +22 -38
  214. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  215. package/dist/cjs/providers/ProviderAdapter.d.ts +94 -0
  216. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -0
  217. package/dist/cjs/providers/ProviderAdapter.js +257 -0
  218. package/dist/cjs/providers/ProviderAdapter.js.map +1 -0
  219. package/dist/cjs/providers/index.d.ts +21 -18
  220. package/dist/cjs/providers/index.d.ts.map +1 -1
  221. package/dist/cjs/providers/index.js +23 -21
  222. package/dist/cjs/providers/index.js.map +1 -1
  223. package/dist/cjs/types/agent.d.ts +37 -11
  224. package/dist/cjs/types/agent.d.ts.map +1 -1
  225. package/dist/cjs/types/ai.d.ts +11 -21
  226. package/dist/cjs/types/ai.d.ts.map +1 -1
  227. package/dist/cjs/types/compaction.d.ts +2 -2
  228. package/dist/cjs/types/compaction.d.ts.map +1 -1
  229. package/dist/cjs/types/errors.d.ts +16 -20
  230. package/dist/cjs/types/errors.d.ts.map +1 -1
  231. package/dist/cjs/types/errors.js +17 -18
  232. package/dist/cjs/types/errors.js.map +1 -1
  233. package/dist/cjs/types/flow.d.ts +56 -39
  234. package/dist/cjs/types/flow.d.ts.map +1 -1
  235. package/dist/cjs/types/history.d.ts +1 -1
  236. package/dist/cjs/types/history.d.ts.map +1 -1
  237. package/dist/cjs/types/index.d.ts +17 -17
  238. package/dist/cjs/types/index.d.ts.map +1 -1
  239. package/dist/cjs/types/index.js +14 -14
  240. package/dist/cjs/types/index.js.map +1 -1
  241. package/dist/cjs/types/persistence.d.ts +2 -2
  242. package/dist/cjs/types/persistence.d.ts.map +1 -1
  243. package/dist/cjs/types/session.d.ts +4 -4
  244. package/dist/cjs/types/session.d.ts.map +1 -1
  245. package/dist/cjs/types/signals.d.ts +3 -3
  246. package/dist/cjs/types/signals.d.ts.map +1 -1
  247. package/dist/cjs/types/template.d.ts +2 -2
  248. package/dist/cjs/types/template.d.ts.map +1 -1
  249. package/dist/cjs/types/tool.d.ts +4 -2
  250. package/dist/cjs/types/tool.d.ts.map +1 -1
  251. package/dist/cjs/types/tool.js.map +1 -1
  252. package/dist/cjs/utils/condition.d.ts +1 -1
  253. package/dist/cjs/utils/condition.d.ts.map +1 -1
  254. package/dist/cjs/utils/condition.js +6 -6
  255. package/dist/cjs/utils/condition.js.map +1 -1
  256. package/dist/cjs/utils/event.d.ts +1 -1
  257. package/dist/cjs/utils/event.d.ts.map +1 -1
  258. package/dist/cjs/utils/event.js +2 -2
  259. package/dist/cjs/utils/event.js.map +1 -1
  260. package/dist/cjs/utils/history.d.ts +2 -2
  261. package/dist/cjs/utils/history.d.ts.map +1 -1
  262. package/dist/cjs/utils/history.js +15 -15
  263. package/dist/cjs/utils/history.js.map +1 -1
  264. package/dist/cjs/utils/index.d.ts +11 -13
  265. package/dist/cjs/utils/index.d.ts.map +1 -1
  266. package/dist/cjs/utils/index.js +57 -58
  267. package/dist/cjs/utils/index.js.map +1 -1
  268. package/dist/cjs/utils/serialize.d.ts +17 -0
  269. package/dist/cjs/utils/serialize.d.ts.map +1 -1
  270. package/dist/cjs/utils/serialize.js +33 -0
  271. package/dist/cjs/utils/serialize.js.map +1 -1
  272. package/dist/cjs/utils/session.d.ts +23 -3
  273. package/dist/cjs/utils/session.d.ts.map +1 -1
  274. package/dist/cjs/utils/session.js +40 -8
  275. package/dist/cjs/utils/session.js.map +1 -1
  276. package/dist/cjs/utils/template.d.ts +3 -3
  277. package/dist/cjs/utils/template.d.ts.map +1 -1
  278. package/dist/cjs/utils/template.js +5 -5
  279. package/dist/cjs/utils/template.js.map +1 -1
  280. package/dist/constants/index.d.ts +1 -0
  281. package/dist/constants/index.js +1 -1
  282. package/dist/core/Agent.d.ts +19 -11
  283. package/dist/core/Agent.d.ts.map +1 -1
  284. package/dist/core/Agent.js +53 -15
  285. package/dist/core/Agent.js.map +1 -1
  286. package/dist/core/AutoChainExecutor.d.ts +12 -22
  287. package/dist/core/AutoChainExecutor.d.ts.map +1 -1
  288. package/dist/core/AutoChainExecutor.js +27 -30
  289. package/dist/core/AutoChainExecutor.js.map +1 -1
  290. package/dist/core/BranchEvaluator.d.ts +4 -4
  291. package/dist/core/BranchEvaluator.d.ts.map +1 -1
  292. package/dist/core/BranchEvaluator.js +2 -2
  293. package/dist/core/BranchEvaluator.js.map +1 -1
  294. package/dist/core/CompactionEngine.d.ts +16 -3
  295. package/dist/core/CompactionEngine.d.ts.map +1 -1
  296. package/dist/core/CompactionEngine.js +30 -6
  297. package/dist/core/CompactionEngine.js.map +1 -1
  298. package/dist/core/DirectiveChainTracker.d.ts +1 -1
  299. package/dist/core/DirectiveChainTracker.d.ts.map +1 -1
  300. package/dist/core/DirectiveChainTracker.js +2 -2
  301. package/dist/core/DirectiveChainTracker.js.map +1 -1
  302. package/dist/core/Events.d.ts +1 -1
  303. package/dist/core/Events.d.ts.map +1 -1
  304. package/dist/core/Events.js +1 -1
  305. package/dist/core/Events.js.map +1 -1
  306. package/dist/core/Flow.d.ts +4 -4
  307. package/dist/core/Flow.d.ts.map +1 -1
  308. package/dist/core/Flow.js +3 -3
  309. package/dist/core/Flow.js.map +1 -1
  310. package/dist/core/FlowRouter.d.ts +4 -4
  311. package/dist/core/FlowRouter.d.ts.map +1 -1
  312. package/dist/core/FlowRouter.js +36 -14
  313. package/dist/core/FlowRouter.js.map +1 -1
  314. package/dist/core/PersistenceManager.d.ts +1 -1
  315. package/dist/core/PersistenceManager.d.ts.map +1 -1
  316. package/dist/core/PersistenceManager.js +3 -3
  317. package/dist/core/PersistenceManager.js.map +1 -1
  318. package/dist/core/PromptComposer.d.ts +4 -4
  319. package/dist/core/PromptComposer.d.ts.map +1 -1
  320. package/dist/core/PromptComposer.js +3 -3
  321. package/dist/core/PromptComposer.js.map +1 -1
  322. package/dist/core/PromptSectionCache.d.ts +2 -2
  323. package/dist/core/PromptSectionCache.d.ts.map +1 -1
  324. package/dist/core/ResponseEngine.d.ts +4 -4
  325. package/dist/core/ResponseEngine.d.ts.map +1 -1
  326. package/dist/core/ResponseEngine.js +2 -2
  327. package/dist/core/ResponseEngine.js.map +1 -1
  328. package/dist/core/ResponseGenerationError.d.ts.map +1 -1
  329. package/dist/core/ResponseGenerationError.js +3 -5
  330. package/dist/core/ResponseGenerationError.js.map +1 -1
  331. package/dist/core/ResponseModal.d.ts +39 -10
  332. package/dist/core/ResponseModal.d.ts.map +1 -1
  333. package/dist/core/ResponseModal.js +152 -29
  334. package/dist/core/ResponseModal.js.map +1 -1
  335. package/dist/core/ResponsePipeline.d.ts +50 -12
  336. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  337. package/dist/core/ResponsePipeline.js +232 -89
  338. package/dist/core/ResponsePipeline.js.map +1 -1
  339. package/dist/core/SessionFinalizer.d.ts +4 -4
  340. package/dist/core/SessionFinalizer.d.ts.map +1 -1
  341. package/dist/core/SessionFinalizer.js +32 -5
  342. package/dist/core/SessionFinalizer.js.map +1 -1
  343. package/dist/core/SessionManager.d.ts +15 -6
  344. package/dist/core/SessionManager.d.ts.map +1 -1
  345. package/dist/core/SessionManager.js +46 -19
  346. package/dist/core/SessionManager.js.map +1 -1
  347. package/dist/core/SignalCoordinator.d.ts +5 -5
  348. package/dist/core/SignalCoordinator.d.ts.map +1 -1
  349. package/dist/core/SignalCoordinator.js +2 -2
  350. package/dist/core/SignalCoordinator.js.map +1 -1
  351. package/dist/core/SignalEvaluator.d.ts +4 -4
  352. package/dist/core/SignalEvaluator.d.ts.map +1 -1
  353. package/dist/core/SignalEvaluator.js +2 -2
  354. package/dist/core/SignalEvaluator.js.map +1 -1
  355. package/dist/core/SignalProcessor.d.ts +6 -6
  356. package/dist/core/SignalProcessor.d.ts.map +1 -1
  357. package/dist/core/SignalProcessor.js +7 -79
  358. package/dist/core/SignalProcessor.js.map +1 -1
  359. package/dist/core/Step.d.ts +5 -5
  360. package/dist/core/Step.d.ts.map +1 -1
  361. package/dist/core/Step.js +53 -5
  362. package/dist/core/Step.js.map +1 -1
  363. package/dist/core/StepLifecycle.d.ts +18 -8
  364. package/dist/core/StepLifecycle.d.ts.map +1 -1
  365. package/dist/core/StepLifecycle.js +98 -15
  366. package/dist/core/StepLifecycle.js.map +1 -1
  367. package/dist/core/StreamingToolExecutor.d.ts +1 -1
  368. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  369. package/dist/core/StreamingToolExecutor.js +29 -5
  370. package/dist/core/StreamingToolExecutor.js.map +1 -1
  371. package/dist/core/ToolLoopExecutor.d.ts +8 -4
  372. package/dist/core/ToolLoopExecutor.d.ts.map +1 -1
  373. package/dist/core/ToolLoopExecutor.js +157 -65
  374. package/dist/core/ToolLoopExecutor.js.map +1 -1
  375. package/dist/core/ToolManager.d.ts +6 -6
  376. package/dist/core/ToolManager.d.ts.map +1 -1
  377. package/dist/core/ToolManager.js +44 -21
  378. package/dist/core/ToolManager.js.map +1 -1
  379. package/dist/core/createAgent.d.ts +2 -2
  380. package/dist/core/createAgent.d.ts.map +1 -1
  381. package/dist/core/createAgent.js +1 -1
  382. package/dist/core/createAgent.js.map +1 -1
  383. package/dist/core/flow-namespace.d.ts +16 -1
  384. package/dist/core/flow-namespace.d.ts.map +1 -1
  385. package/dist/core/flow-namespace.js +23 -1
  386. package/dist/core/flow-namespace.js.map +1 -1
  387. package/dist/core/toolGates.d.ts +1 -1
  388. package/dist/core/toolGates.d.ts.map +1 -1
  389. package/dist/core/toolGates.js +1 -1
  390. package/dist/core/toolGates.js.map +1 -1
  391. package/dist/index.d.ts +50 -45
  392. package/dist/index.d.ts.map +1 -1
  393. package/dist/index.js +34 -30
  394. package/dist/index.js.map +1 -1
  395. package/dist/providers/AnthropicProvider.d.ts +25 -35
  396. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  397. package/dist/providers/AnthropicProvider.js +30 -423
  398. package/dist/providers/AnthropicProvider.js.map +1 -1
  399. package/dist/providers/DeepSeekProvider.d.ts +13 -34
  400. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  401. package/dist/providers/DeepSeekProvider.js +16 -47
  402. package/dist/providers/DeepSeekProvider.js.map +1 -1
  403. package/dist/providers/GeminiProvider.d.ts +22 -75
  404. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  405. package/dist/providers/GeminiProvider.js +32 -558
  406. package/dist/providers/GeminiProvider.js.map +1 -1
  407. package/dist/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  408. package/dist/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  409. package/dist/providers/GenericOpenAICompatibleProvider.js +13 -16
  410. package/dist/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  411. package/dist/providers/OpenAICompatibleProvider.d.ts +26 -135
  412. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  413. package/dist/providers/OpenAICompatibleProvider.js +39 -495
  414. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  415. package/dist/providers/OpenAIProvider.d.ts +14 -20
  416. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  417. package/dist/providers/OpenAIProvider.js +20 -24
  418. package/dist/providers/OpenAIProvider.js.map +1 -1
  419. package/dist/providers/OpenRouterProvider.d.ts +20 -24
  420. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  421. package/dist/providers/OpenRouterProvider.js +21 -34
  422. package/dist/providers/OpenRouterProvider.js.map +1 -1
  423. package/dist/providers/ProviderAdapter.d.ts +94 -0
  424. package/dist/providers/ProviderAdapter.d.ts.map +1 -0
  425. package/dist/providers/ProviderAdapter.js +251 -0
  426. package/dist/providers/ProviderAdapter.js.map +1 -0
  427. package/dist/providers/index.d.ts +21 -18
  428. package/dist/providers/index.d.ts.map +1 -1
  429. package/dist/providers/index.js +13 -10
  430. package/dist/providers/index.js.map +1 -1
  431. package/dist/types/agent.d.ts +37 -11
  432. package/dist/types/agent.d.ts.map +1 -1
  433. package/dist/types/ai.d.ts +11 -21
  434. package/dist/types/ai.d.ts.map +1 -1
  435. package/dist/types/compaction.d.ts +2 -2
  436. package/dist/types/compaction.d.ts.map +1 -1
  437. package/dist/types/errors.d.ts +16 -20
  438. package/dist/types/errors.d.ts.map +1 -1
  439. package/dist/types/errors.js +15 -16
  440. package/dist/types/errors.js.map +1 -1
  441. package/dist/types/flow.d.ts +56 -39
  442. package/dist/types/flow.d.ts.map +1 -1
  443. package/dist/types/history.d.ts +1 -1
  444. package/dist/types/history.d.ts.map +1 -1
  445. package/dist/types/index.d.ts +17 -17
  446. package/dist/types/index.d.ts.map +1 -1
  447. package/dist/types/index.js +4 -4
  448. package/dist/types/index.js.map +1 -1
  449. package/dist/types/persistence.d.ts +2 -2
  450. package/dist/types/persistence.d.ts.map +1 -1
  451. package/dist/types/session.d.ts +4 -4
  452. package/dist/types/session.d.ts.map +1 -1
  453. package/dist/types/signals.d.ts +3 -3
  454. package/dist/types/signals.d.ts.map +1 -1
  455. package/dist/types/template.d.ts +2 -2
  456. package/dist/types/template.d.ts.map +1 -1
  457. package/dist/types/tool.d.ts +4 -2
  458. package/dist/types/tool.d.ts.map +1 -1
  459. package/dist/types/tool.js.map +1 -1
  460. package/dist/utils/condition.d.ts +1 -1
  461. package/dist/utils/condition.d.ts.map +1 -1
  462. package/dist/utils/condition.js +2 -2
  463. package/dist/utils/condition.js.map +1 -1
  464. package/dist/utils/event.d.ts +1 -1
  465. package/dist/utils/event.d.ts.map +1 -1
  466. package/dist/utils/event.js +1 -1
  467. package/dist/utils/event.js.map +1 -1
  468. package/dist/utils/history.d.ts +2 -2
  469. package/dist/utils/history.d.ts.map +1 -1
  470. package/dist/utils/history.js +1 -1
  471. package/dist/utils/history.js.map +1 -1
  472. package/dist/utils/index.d.ts +11 -13
  473. package/dist/utils/index.d.ts.map +1 -1
  474. package/dist/utils/index.js +11 -12
  475. package/dist/utils/index.js.map +1 -1
  476. package/dist/utils/serialize.d.ts +17 -0
  477. package/dist/utils/serialize.d.ts.map +1 -1
  478. package/dist/utils/serialize.js +31 -0
  479. package/dist/utils/serialize.js.map +1 -1
  480. package/dist/utils/session.d.ts +23 -3
  481. package/dist/utils/session.d.ts.map +1 -1
  482. package/dist/utils/session.js +35 -6
  483. package/dist/utils/session.js.map +1 -1
  484. package/dist/utils/template.d.ts +3 -3
  485. package/dist/utils/template.d.ts.map +1 -1
  486. package/dist/utils/template.js +1 -1
  487. package/dist/utils/template.js.map +1 -1
  488. package/docs/concepts/architecture.md +3 -3
  489. package/docs/concepts/directives.md +1 -1
  490. package/docs/guides/error-handling.md +46 -45
  491. package/docs/guides/flow-control.md +8 -1
  492. package/docs/guides/instructions.md +15 -6
  493. package/docs/guides/persistence.md +12 -5
  494. package/docs/guides/streaming.md +10 -0
  495. package/docs/migration/README.md +4 -0
  496. package/docs/migration/v2-3-to-v2-4.md +4 -0
  497. package/docs/migration/v2-6-to-v2-7.md +246 -0
  498. package/docs/reference/adapters.md +15 -1
  499. package/docs/reference/branches.md +2 -0
  500. package/docs/reference/create-agent.md +28 -0
  501. package/docs/reference/directive.md +1 -1
  502. package/docs/reference/errors.md +30 -32
  503. package/docs/reference/providers.md +63 -60
  504. package/docs/reference/step.md +28 -21
  505. package/docs/reference/tool.md +14 -5
  506. package/docs/start/02-first-agent.md +8 -4
  507. package/docs/start/03-collect-data.md +19 -10
  508. package/examples/01-quickstart.ts +2 -2
  509. package/examples/02-data-extraction.ts +1 -1
  510. package/examples/03-tools.ts +1 -1
  511. package/examples/04-instructions.ts +2 -2
  512. package/examples/05-branching.ts +3 -3
  513. package/examples/06-flow-control.ts +3 -3
  514. package/examples/07-streaming.ts +1 -1
  515. package/examples/08-persistence.ts +2 -2
  516. package/examples/09-signals.ts +1 -1
  517. package/examples/tsconfig.json +6 -3
  518. package/package.json +9 -7
  519. package/src/adapters/MemoryAdapter.ts +33 -37
  520. package/src/adapters/MongoAdapter.ts +3 -3
  521. package/src/adapters/OpenSearchAdapter.ts +4 -4
  522. package/src/adapters/PostgreSQLAdapter.ts +26 -21
  523. package/src/adapters/PrismaAdapter.ts +4 -4
  524. package/src/adapters/RedisAdapter.ts +84 -37
  525. package/src/adapters/SQLiteAdapter.ts +13 -34
  526. package/src/adapters/index.ts +13 -13
  527. package/src/adapters/sessionRow.ts +57 -0
  528. package/src/core/Agent.ts +64 -18
  529. package/src/core/AutoChainExecutor.ts +44 -57
  530. package/src/core/BranchEvaluator.ts +5 -5
  531. package/src/core/CompactionEngine.ts +42 -8
  532. package/src/core/DirectiveChainTracker.ts +3 -3
  533. package/src/core/Events.ts +2 -2
  534. package/src/core/Flow.ts +9 -9
  535. package/src/core/FlowRouter.ts +46 -20
  536. package/src/core/PersistenceManager.ts +4 -4
  537. package/src/core/PromptComposer.ts +8 -8
  538. package/src/core/PromptSectionCache.ts +2 -2
  539. package/src/core/ResponseEngine.ts +6 -6
  540. package/src/core/ResponseGenerationError.ts +3 -6
  541. package/src/core/ResponseModal.ts +205 -39
  542. package/src/core/ResponsePipeline.ts +301 -107
  543. package/src/core/SessionFinalizer.ts +40 -10
  544. package/src/core/SessionManager.ts +61 -27
  545. package/src/core/SignalCoordinator.ts +7 -7
  546. package/src/core/SignalEvaluator.ts +6 -6
  547. package/src/core/SignalProcessor.ts +13 -93
  548. package/src/core/Step.ts +87 -10
  549. package/src/core/StepLifecycle.ts +129 -26
  550. package/src/core/StreamingToolExecutor.ts +33 -8
  551. package/src/core/ToolLoopExecutor.ts +206 -80
  552. package/src/core/ToolManager.ts +53 -26
  553. package/src/core/createAgent.ts +2 -2
  554. package/src/core/flow-namespace.ts +31 -2
  555. package/src/core/toolGates.ts +2 -2
  556. package/src/index.ts +59 -45
  557. package/src/providers/AnthropicProvider.ts +44 -595
  558. package/src/providers/DeepSeekProvider.ts +27 -92
  559. package/src/providers/GeminiProvider.ts +41 -752
  560. package/src/providers/GenericOpenAICompatibleProvider.ts +19 -27
  561. package/src/providers/OpenAICompatibleProvider.ts +58 -764
  562. package/src/providers/OpenAIProvider.ts +31 -55
  563. package/src/providers/OpenRouterProvider.ts +40 -70
  564. package/src/providers/ProviderAdapter.ts +368 -0
  565. package/src/providers/index.ts +21 -23
  566. package/src/types/agent.ts +36 -11
  567. package/src/types/ai.ts +11 -21
  568. package/src/types/compaction.ts +2 -2
  569. package/src/types/errors.ts +17 -35
  570. package/src/types/flow.ts +44 -46
  571. package/src/types/history.ts +1 -1
  572. package/src/types/index.ts +18 -17
  573. package/src/types/persistence.ts +2 -2
  574. package/src/types/session.ts +4 -4
  575. package/src/types/signals.ts +3 -3
  576. package/src/types/template.ts +2 -2
  577. package/src/types/tool.ts +4 -2
  578. package/src/utils/condition.ts +3 -3
  579. package/src/utils/event.ts +1 -1
  580. package/src/utils/history.ts +3 -3
  581. package/src/utils/index.ts +14 -15
  582. package/src/utils/serialize.ts +38 -0
  583. package/src/utils/session.ts +46 -9
  584. package/src/utils/template.ts +3 -3
  585. package/dist/cjs/core/DirectiveBus.d.ts +0 -88
  586. package/dist/cjs/core/DirectiveBus.d.ts.map +0 -1
  587. package/dist/cjs/core/DirectiveBus.js +0 -196
  588. package/dist/cjs/core/DirectiveBus.js.map +0 -1
  589. package/dist/cjs/providers/errorClassification.d.ts +0 -61
  590. package/dist/cjs/providers/errorClassification.d.ts.map +0 -1
  591. package/dist/cjs/providers/errorClassification.js +0 -123
  592. package/dist/cjs/providers/errorClassification.js.map +0 -1
  593. package/dist/cjs/utils/retry.d.ts +0 -67
  594. package/dist/cjs/utils/retry.d.ts.map +0 -1
  595. package/dist/cjs/utils/retry.js +0 -201
  596. package/dist/cjs/utils/retry.js.map +0 -1
  597. package/dist/core/DirectiveBus.d.ts +0 -88
  598. package/dist/core/DirectiveBus.d.ts.map +0 -1
  599. package/dist/core/DirectiveBus.js +0 -192
  600. package/dist/core/DirectiveBus.js.map +0 -1
  601. package/dist/providers/errorClassification.d.ts +0 -61
  602. package/dist/providers/errorClassification.d.ts.map +0 -1
  603. package/dist/providers/errorClassification.js +0 -116
  604. package/dist/providers/errorClassification.js.map +0 -1
  605. package/dist/utils/retry.d.ts +0 -67
  606. package/dist/utils/retry.d.ts.map +0 -1
  607. package/dist/utils/retry.js +0 -193
  608. package/dist/utils/retry.js.map +0 -1
  609. package/src/core/DirectiveBus.ts +0 -248
  610. package/src/providers/errorClassification.ts +0 -172
  611. package/src/utils/retry.ts +0 -274
@@ -11,12 +11,13 @@
11
11
  * yield sites.
12
12
  */
13
13
 
14
- import type { AgentOptions, SessionState } from "../types";
15
- import type { CompactionOptions } from "../types/compaction";
16
- import type { PersistenceManager } from "./PersistenceManager";
17
- import type { StepLifecycle } from "./StepLifecycle";
18
- import { CompactionEngine } from "./CompactionEngine";
19
- import { logger } from "../utils";
14
+ import type { AgentOptions, SessionState } from "../types/index.js";
15
+ import type { CompactionOptions } from "../types/compaction.js";
16
+ import type { PersistenceManager } from "./PersistenceManager.js";
17
+ import type { StepLifecycle } from "./StepLifecycle.js";
18
+ import { flow } from "./flow-namespace.js";
19
+ import { CompactionEngine } from "./CompactionEngine.js";
20
+ import { boundConversationHistory, DEFAULT_MAX_HISTORY_MESSAGES, logger } from "../utils/index.js";
20
21
 
21
22
  export class SessionFinalizer<TContext = unknown, TData = unknown> {
22
23
  constructor(
@@ -36,6 +37,24 @@ export class SessionFinalizer<TContext = unknown, TData = unknown> {
36
37
  * Handle session persistence and finalization.
37
38
  */
38
39
  async finalize(session: SessionState<TData>, context: TContext): Promise<void> {
40
+ const agentOptions = this.deps.getAgentOptions();
41
+
42
+ // Hard history bound — backstop when no compaction is configured (or
43
+ // after it ran). Unbounded growth eventually bricks the thread at the
44
+ // provider context limit.
45
+ const historyCap = agentOptions.maxHistoryMessages ?? DEFAULT_MAX_HISTORY_MESSAGES;
46
+ if (historyCap > 0 && session.history && session.history.length > historyCap) {
47
+ const bounded = boundConversationHistory(session.history, historyCap);
48
+ if (bounded !== session.history) {
49
+ logger.warn(
50
+ `[SessionFinalizer] Session "${session.id}" history exceeded ${historyCap} entries ` +
51
+ `(${session.history.length}); trimmed the oldest. Configure compaction for ` +
52
+ `summarization instead of truncation, or raise maxHistoryMessages.`
53
+ );
54
+ session.history = bounded;
55
+ }
56
+ }
57
+
39
58
  // Deterministic compaction: runs on every finalize (not just addMessage)
40
59
  // so respond()-only callers get bounded history too
41
60
  const compactionOptions = this.deps.getCompactionOptions();
@@ -54,9 +73,23 @@ export class SessionFinalizer<TContext = unknown, TData = unknown> {
54
73
  }
55
74
  }
56
75
 
76
+ // Execute finalize BEFORE persisting so its state writes (which now
77
+ // land on this turn's session) are captured by the save below. A
78
+ // control-flow directive returned by finalize queues on the session —
79
+ // the pendingDirective applier applies it at the START of the next turn.
80
+ let finalizeDirective;
81
+ try {
82
+ finalizeDirective = await this.deps.stepLifecycle.runFinalize(session, context);
83
+ } catch (error) {
84
+ logger.error("[SessionFinalizer] Step finalize hook failed:", error);
85
+ throw error;
86
+ }
87
+ if (finalizeDirective) {
88
+ flow.queuePending(session, finalizeDirective);
89
+ }
90
+
57
91
  // Auto-save session step to persistence if configured
58
92
  const persistenceManager = this.deps.getPersistenceManager();
59
- const agentOptions = this.deps.getAgentOptions();
60
93
  if (
61
94
  persistenceManager &&
62
95
  session.id &&
@@ -66,9 +99,6 @@ export class SessionFinalizer<TContext = unknown, TData = unknown> {
66
99
  logger.debug(`[SessionFinalizer] Auto-saved session step to persistence: ${session.id}`);
67
100
  }
68
101
 
69
- // Execute finalize function
70
- await this.deps.stepLifecycle.runFinalize(session, context);
71
-
72
102
  // Update current session if we have one
73
103
  const currentSession = this.deps.getCurrentSession();
74
104
  if (currentSession) {
@@ -6,13 +6,13 @@
6
6
  */
7
7
 
8
8
  import log from "loglevel";
9
- import type { SessionState } from "../types/session";
10
- import type { History, HistoryItem } from "../types/history";
11
- import { PersistenceManager } from "./PersistenceManager";
12
- import { CompactionEngine } from "./CompactionEngine";
13
- import type { PersistenceAdapter } from "../types/persistence";
14
- import type { Agent } from "./Agent";
15
- import { createSession } from "../utils";
9
+ import type { SessionState } from "../types/session.js";
10
+ import type { History, HistoryItem } from "../types/history.js";
11
+ import { PersistenceManager } from "./PersistenceManager.js";
12
+ import { CompactionEngine } from "./CompactionEngine.js";
13
+ import type { PersistenceAdapter } from "../types/persistence.js";
14
+ import type { Agent } from "./Agent.js";
15
+ import { boundConversationHistory, createSession, DEFAULT_MAX_HISTORY_MESSAGES } from "../utils/index.js";
16
16
 
17
17
  /**
18
18
  * SessionManager handles session lifecycle and conversation history
@@ -24,6 +24,9 @@ export class SessionManager<TData = unknown> {
24
24
  private agent?: Agent<any, TData>;
25
25
  private defaultSessionId?: string;
26
26
 
27
+ /** Coalesces concurrent getOrCreate calls for the same session id. */
28
+ private inflightGets = new Map<string, Promise<SessionState<TData>>>();
29
+
27
30
  constructor(
28
31
  persistenceManagerOrAdapter?:
29
32
  | PersistenceManager<TData>
@@ -56,7 +59,13 @@ export class SessionManager<TData = unknown> {
56
59
 
57
60
  /**
58
61
  * Core method: getOrCreate handles both existing and new sessions
59
- * Works for sessionIds that exist, don't exist, or auto-generated IDs
62
+ * Works for sessionIds that exist, don't exist, or auto-generated IDs.
63
+ *
64
+ * Concurrent calls for the same id are COALESCED into one in-flight load:
65
+ * the Agent constructor fires an un-awaited getOrCreate while a first turn
66
+ * may already be starting — without coalescing, both calls can observe a
67
+ * missing row and create two competing sessions (one blanking the other's
68
+ * persisted state).
60
69
  */
61
70
  async getOrCreate(sessionId?: string): Promise<SessionState<TData>> {
62
71
  // SECURITY: a non-string sessionId (e.g. `{ $ne: null }` from an HTTP body
@@ -69,6 +78,23 @@ export class SessionManager<TData = unknown> {
69
78
  // Use provided sessionId or fall back to default
70
79
  const effectiveSessionId = sessionId || this.defaultSessionId;
71
80
 
81
+ const inflightKey = effectiveSessionId || "__auto__";
82
+ const inflight = this.inflightGets.get(inflightKey);
83
+ if (inflight) {
84
+ return inflight;
85
+ }
86
+
87
+ const promise = this.getOrCreateInner(effectiveSessionId).finally(() => {
88
+ this.inflightGets.delete(inflightKey);
89
+ });
90
+ this.inflightGets.set(inflightKey, promise);
91
+ return promise;
92
+ }
93
+
94
+ private async getOrCreateInner(
95
+ effectiveSessionId: string | undefined
96
+ ): Promise<SessionState<TData>> {
97
+
72
98
  // If we already have a session and no sessionId specified, return it
73
99
  if (this.currentSession && !effectiveSessionId) {
74
100
  return this.currentSession;
@@ -79,27 +105,25 @@ export class SessionManager<TData = unknown> {
79
105
  return this.currentSession;
80
106
  }
81
107
 
82
- // If sessionId provided, try to load it first
108
+ // If sessionId provided, try to load it first. A missing row returns
109
+ // `null` (→ create below); a FAILED load throws — swallowing it here used
110
+ // to fall through to create(), which saved a blank session over the
111
+ // existing row and erased the user's conversation on a transient DB error.
83
112
  if (effectiveSessionId && this.persistenceManager) {
84
- try {
85
- const session = await this.persistenceManager.loadSessionState(
86
- effectiveSessionId
87
- );
88
- if (session) {
89
- // Loaded session data wins over anything staged before it existed
90
- const pending = this.agent?.consumePendingData();
91
- if (pending && Object.keys(pending).length > 0) {
92
- log.debug(
93
- "SessionManager: discarding pre-session staged data in favor of loaded session state",
94
- pending
95
- );
96
- }
97
- this.currentSession = session;
98
- return session;
113
+ const session = await this.persistenceManager.loadSessionState(
114
+ effectiveSessionId
115
+ );
116
+ if (session) {
117
+ // Loaded session data wins over anything staged before it existed
118
+ const pending = this.agent?.consumePendingData();
119
+ if (pending && Object.keys(pending).length > 0) {
120
+ log.debug(
121
+ "SessionManager: discarding pre-session staged data in favor of loaded session state",
122
+ pending
123
+ );
99
124
  }
100
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
101
- } catch (_error) {
102
- // Session doesn't exist, will create new one with this ID
125
+ this.currentSession = session;
126
+ return session;
103
127
  }
104
128
  }
105
129
 
@@ -150,6 +174,16 @@ export class SessionManager<TData = unknown> {
150
174
  };
151
175
 
152
176
  session.history.push(historyItem);
177
+ // Same hard bound the finalizer applies — keeps interim auto-saves bounded
178
+ // on the chat()/stream() path too.
179
+ const cap = this.agent?.getAgentOptions().maxHistoryMessages ?? DEFAULT_MAX_HISTORY_MESSAGES;
180
+ if (cap > 0 && session.history) {
181
+ const bounded = boundConversationHistory(session.history, cap);
182
+ if (bounded !== session.history) {
183
+ log.warn(`SessionManager: history exceeded ${cap} entries; trimmed the oldest.`);
184
+ session.history = bounded;
185
+ }
186
+ }
153
187
  session.metadata!.lastUpdatedAt = new Date();
154
188
 
155
189
  // Ensure currentSession is updated
@@ -12,13 +12,13 @@
12
12
  * of the user-visible message.
13
13
  */
14
14
 
15
- import type { Directive, Event, SessionState } from "../types";
16
- import type { SignalFiring } from "../types/signals";
17
- import type { SignalProcessor } from "./SignalProcessor";
18
- import type { Flow } from "./Flow";
19
- import type { Step } from "./Step";
20
- import { hasDirectivePositionField } from "./ResponsePipeline";
21
- import { enterFlow, enterStep, mergeCollected, logger } from "../utils";
15
+ import type { Directive, Event, SessionState } from "../types/index.js";
16
+ import type { SignalFiring } from "../types/signals.js";
17
+ import type { SignalProcessor } from "./SignalProcessor.js";
18
+ import type { Flow } from "./Flow.js";
19
+ import type { Step } from "./Step.js";
20
+ import { hasDirectivePositionField } from "./ResponsePipeline.js";
21
+ import { enterFlow, enterStep, mergeCollected, logger } from "../utils/index.js";
22
22
 
23
23
  /** Result of a signal phase run (pre or post). */
24
24
  export interface SignalPhaseResult<TContext = unknown, TData = unknown> {
@@ -9,16 +9,16 @@
9
9
  * @module SignalEvaluator
10
10
  */
11
11
 
12
- import type { AiProvider } from "../types/ai";
13
- import type { Event } from "../types/history";
14
- import type { SessionState } from "../types/session";
12
+ import type { AiProvider } from "../types/ai.js";
13
+ import type { Event } from "../types/history.js";
14
+ import type { SessionState } from "../types/session.js";
15
15
  import type {
16
16
  Signal,
17
17
  SignalPredicate,
18
18
  SignalPredicateContext,
19
- } from "../types/signals";
20
- import { eventsToHistory, logger } from "../utils";
21
- import { splitWhenConditions, evaluateIfPredicates } from "../utils/condition";
19
+ } from "../types/signals.js";
20
+ import { eventsToHistory, logger } from "../utils/index.js";
21
+ import { splitWhenConditions, evaluateIfPredicates } from "../utils/condition.js";
22
22
 
23
23
  // ──────────────────────────────────────────────────────────────────────────────
24
24
  // Types
@@ -11,11 +11,11 @@
11
11
  * @module SignalProcessor
12
12
  */
13
13
 
14
- import type { AiProvider } from "../types/ai";
15
- import type { Event } from "../types/history";
16
- import { MessageRole as MessageRoleEnum } from "../types/history";
17
- import type { SessionState } from "../types/session";
18
- import type { Directive } from "../types/flow";
14
+ import type { AiProvider } from "../types/ai.js";
15
+ import type { Event } from "../types/history.js";
16
+ import { MessageRole as MessageRoleEnum } from "../types/history.js";
17
+ import type { SessionState } from "../types/session.js";
18
+ import type { Directive } from "../types/flow.js";
19
19
  import type {
20
20
  Signal,
21
21
  SignalContext,
@@ -23,9 +23,10 @@ import type {
23
23
  SignalFiring,
24
24
  SignalPredicateContext,
25
25
  SignalTriggerState,
26
- } from "../types/signals";
27
- import type { SignalEvaluator } from "./SignalEvaluator";
28
- import { logger } from "../utils";
26
+ } from "../types/signals.js";
27
+ import type { SignalEvaluator } from "./SignalEvaluator.js";
28
+ import { flow } from "./flow-namespace.js";
29
+ import { logger } from "../utils/index.js";
29
30
 
30
31
  /** Recorded on `SignalFiring.extractionError` when a matched extraction-mode
31
32
  * signal yields no payload (model omitted the field or returned null). */
@@ -654,90 +655,9 @@ export class SignalProcessor<TContext = unknown, TData = unknown> {
654
655
  private mergeDirectives(
655
656
  directives: SignalDirective<TContext, TData>[],
656
657
  ): Directive<TContext, TData> {
657
- const merged: Directive<TContext, TData> = {};
658
-
659
- for (const d of directives) {
660
- // Position fields — last-write-wins
661
- if (d.goTo !== undefined) {
662
- merged.goTo = d.goTo;
663
- // Clear other position fields
664
- delete merged.goToStep;
665
- delete merged.complete;
666
- delete merged.abort;
667
- delete merged.reset;
668
- }
669
- if (d.goToStep !== undefined) {
670
- merged.goToStep = d.goToStep;
671
- delete merged.goTo;
672
- delete merged.complete;
673
- delete merged.abort;
674
- delete merged.reset;
675
- }
676
- if (d.complete !== undefined) {
677
- merged.complete = d.complete;
678
- delete merged.goTo;
679
- delete merged.goToStep;
680
- delete merged.abort;
681
- delete merged.reset;
682
- }
683
- if (d.abort !== undefined) {
684
- merged.abort = d.abort;
685
- delete merged.goTo;
686
- delete merged.goToStep;
687
- delete merged.complete;
688
- delete merged.reset;
689
- }
690
- if (d.reset !== undefined) {
691
- merged.reset = d.reset;
692
- delete merged.goTo;
693
- delete merged.goToStep;
694
- delete merged.complete;
695
- delete merged.abort;
696
- }
697
-
698
- // halt — last-write-wins
699
- if (d.halt !== undefined) {
700
- merged.halt = d.halt;
701
- }
702
-
703
- // reply — last-write-wins
704
- if (d.reply !== undefined) {
705
- merged.reply = d.reply;
706
- }
707
-
708
- // appendPrompt — array-concat
709
- if (d.appendPrompt != null) {
710
- merged.appendPrompt = [
711
- ...(merged.appendPrompt ?? []),
712
- ...d.appendPrompt,
713
- ];
714
- }
715
-
716
- // injectTools — array-concat
717
- if (d.injectTools != null) {
718
- merged.injectTools = [
719
- ...(merged.injectTools ?? []),
720
- ...d.injectTools,
721
- ];
722
- }
723
-
724
- // dataUpdate — shallow-merge
725
- if (d.dataUpdate != null) {
726
- merged.dataUpdate = {
727
- ...(merged.dataUpdate ?? {}),
728
- ...d.dataUpdate,
729
- };
730
- }
731
-
732
- // contextUpdate — shallow-merge
733
- if (d.contextUpdate != null) {
734
- merged.contextUpdate = {
735
- ...(merged.contextUpdate ?? {}),
736
- ...d.contextUpdate,
737
- };
738
- }
739
- }
740
-
741
- return merged;
658
+ // Canonical Algorithm 4 merge — one algorithm shared with tools and
659
+ // step hooks (position precedence, reply last-wins, state shallow-merge,
660
+ // halt OR). Empty in, empty ({}) out.
661
+ return flow.mergeAll(directives) ?? {};
742
662
  }
743
663
  }
package/src/core/Step.ts CHANGED
@@ -9,14 +9,15 @@ import type {
9
9
  Instruction,
10
10
  Tool,
11
11
  PrepareResult,
12
- } from "../types";
13
- import type { SessionState } from "../types/session";
14
- import type { StepResult, BranchSpec, BranchResult } from "../types/flow";
15
- import { ToolScope, Template, TemplateContext } from "../types";
16
- import type { ConditionWhen, ConditionIf } from "../types/flow";
17
- import { generateStepId, logger } from "../utils";
18
- import { splitWhenConditions } from "../utils/condition";
19
- import { Agent } from './Agent'
12
+ } from "../types/index.js";
13
+ import type { SessionState } from "../types/session.js";
14
+ import type { StepResult, BranchSpec, BranchResult } from "../types/flow.js";
15
+ import { ToolScope, Template, TemplateContext } from "../types/index.js";
16
+ import type { ConditionWhen, ConditionIf } from "../types/flow.js";
17
+ import { generateStepId, logger } from "../utils/index.js";
18
+ import { splitWhenConditions } from "../utils/condition.js";
19
+ import { Agent } from './Agent.js'
20
+ import { flow } from "./flow-namespace.js";
20
21
 
21
22
  /**
22
23
  * Error thrown when a step's configuration violates auto-step constraints.
@@ -28,6 +29,27 @@ export class FlowConfigurationError extends Error {
28
29
  }
29
30
  }
30
31
 
32
+ /** The function-form of step prepare/finalize. */
33
+ type StepPrepareFn<TContext, TData> = (
34
+ context: TContext,
35
+ data?: Partial<TData>
36
+ ) => void | PrepareResult<TContext, TData> | Promise<void | PrepareResult<TContext, TData>>;
37
+
38
+ /**
39
+ * Merge two handler results (shorthand + hooks.* desugar). Scalar/object
40
+ * results merge via the canonical Algorithm 4; void/undefined passes through.
41
+ */
42
+ function mergeHookResults<TContext, TData>(
43
+ a: void | PrepareResult<TContext, TData>,
44
+ b: void | PrepareResult<TContext, TData>
45
+ ): PrepareResult<TContext, TData> | undefined {
46
+ if (a == null) return b ?? undefined;
47
+ if (b == null) return a;
48
+ // PrepareResult is a structural subset of Directive — the canonical merge
49
+ // accepts both sides and its output remains a valid PrepareResult.
50
+ return flow.merge<TContext, TData>(a, b);
51
+ }
52
+
31
53
  /**
32
54
  * Represents a step within a route
33
55
  */
@@ -89,8 +111,63 @@ export class Step<TContext = unknown, TData = unknown> {
89
111
  this.reply = options.reply;
90
112
  this.when = options.when;
91
113
  this.if = options.if;
92
- this.prepare = options.prepare;
93
- this.finalize = options.finalize;
114
+
115
+ // Desugar `hooks.prepare` / `hooks.finalize` onto the shorthand fields so
116
+ // both spellings run through the same lifecycle machinery. When both are
117
+ // declared, both run — the shorthand first, then the hook — with their
118
+ // directive returns merged via Algorithm 4 (same desugar pattern as
119
+ // flow-level onComplete).
120
+ const hooks = options.hooks;
121
+
122
+ /** Compose a function-form shorthand with a function-form hook. */
123
+ const composeWithHook = (
124
+ base: StepPrepareFn<TContext, TData> | undefined,
125
+ hook: StepPrepareFn<TContext, TData>
126
+ ): StepPrepareFn<TContext, TData> => {
127
+ if (!base) return hook;
128
+ return async (context, data) =>
129
+ mergeHookResults<TContext, TData>(
130
+ await base(context, data),
131
+ await hook(context, data)
132
+ );
133
+ };
134
+
135
+ if (hooks?.prepare) {
136
+ const hookPrepare: StepPrepareFn<TContext, TData> = (context, data) =>
137
+ hooks.prepare!(context, data);
138
+ const base = options.prepare;
139
+ // A tool-reference shorthand cannot compose with a function hook in a
140
+ // single field — refuse loudly instead of silently dropping one.
141
+ if (base != null && typeof base !== "function") {
142
+ throw new FlowConfigurationError(
143
+ `[FlowConfigurationError] Step "${this.id}" declares both a tool-based prepare and hooks.prepare. A step can only have one prepare handler — remove one or inline the tool call inside the function.`
144
+ );
145
+ }
146
+ this.prepare = composeWithHook(
147
+ typeof base === "function" ? base : undefined,
148
+ hookPrepare
149
+ );
150
+ } else {
151
+ this.prepare = options.prepare;
152
+ }
153
+
154
+ if (hooks?.finalize) {
155
+ const hookFinalize: StepPrepareFn<TContext, TData> = (context, data) =>
156
+ hooks.finalize!(context, data);
157
+ const base = options.finalize;
158
+ if (base != null && typeof base !== "function") {
159
+ throw new FlowConfigurationError(
160
+ `[FlowConfigurationError] Step "${this.id}" declares both a tool-based finalize and hooks.finalize. A step can only have one finalize handler — remove one or inline the tool call inside the function.`
161
+ );
162
+ }
163
+ this.finalize = composeWithHook(
164
+ typeof base === "function" ? base : undefined,
165
+ hookFinalize
166
+ );
167
+ } else {
168
+ this.finalize = options.finalize;
169
+ }
170
+
94
171
  this.tools = options.tools;
95
172
 
96
173
  // Validate when/if split: functions belong on `if`, not `when`