@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
@@ -5,14 +5,14 @@ import type {
5
5
  SessionState,
6
6
  AiProvider,
7
7
  TemplateContext,
8
- } from "../types";
9
- import { MessageRole } from "../types";
10
- import { enterFlow, mergeCollected, isFlowCompletedThisSession } from "../utils";
11
- import type { Flow } from "./Flow";
12
- import type { Step } from "./Step";
13
- import { PromptComposer } from "./PromptComposer";
14
- import { PromptSectionCache } from "./PromptSectionCache";
15
- import { createTemplateContext, getLastMessageFromHistory, logger, eventsToHistory } from "../utils";
8
+ } from "../types/index.js";
9
+ import { MessageRole } from "../types/index.js";
10
+ import { enterFlow, mergeCollected, isFlowCompletedThisSession } from "../utils/index.js";
11
+ import type { Flow } from "./Flow.js";
12
+ import type { Step } from "./Step.js";
13
+ import { PromptComposer } from "./PromptComposer.js";
14
+ import { PromptSectionCache } from "./PromptSectionCache.js";
15
+ import { createTemplateContext, getLastMessageFromHistory, logger, eventsToHistory } from "../utils/index.js";
16
16
 
17
17
  export interface CandidateStep<TContext = unknown, TData = unknown> {
18
18
  step: Step<TContext, TData>;
@@ -919,6 +919,18 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
919
919
  logger.debug(`[FlowRouter] Selected route: ${selectedFlow.title}`);
920
920
  updatedSession = this.enterFlowIfNeeded(updatedSession, selectedFlow);
921
921
  }
922
+ } else {
923
+ // Routing LLM output could not be parsed into the expected structured
924
+ // shape (no `flows` payload). The turn degrades to a fallback response
925
+ // with the flow position untouched — surface that loudly instead of
926
+ // failing silently.
927
+ const rawSnippet = (routingResult.message ?? "").trim().slice(0, 120);
928
+ logger.warn(
929
+ `[FlowRouter] Routing output unparseable: routing LLM returned no structured "flows" payload` +
930
+ `${rawSnippet ? `; raw output: "${rawSnippet}"` : ""}. ` +
931
+ `This turn degrades to a generic fallback response and the flow position is left unchanged. ` +
932
+ `Check the provider's structured-output/JSON support or inspect the routing prompt for schema violations.`
933
+ );
922
934
  }
923
935
 
924
936
  return {
@@ -1041,25 +1053,39 @@ export class FlowRouter<TContext = unknown, TData = unknown> {
1041
1053
  }
1042
1054
 
1043
1055
  // Apply sticky routing: if there's a current route, only switch if the
1044
- // best alternative exceeds the current flow's score by the configured margin
1056
+ // best alternative exceeds the current flow's score by the configured margin.
1057
+ // The margin applies symmetrically: even when the current flow has no
1058
+ // weighted entry (the AI scored it 0 or omitted it), switching away
1059
+ // requires clearing the margin over a zero baseline — shared agent-level
1060
+ // data can otherwise zero out a mid-conversation flow.
1045
1061
  if (currentRouteId) {
1046
1062
  const currentEntry = weightedScores.find(e => e.route.id === currentRouteId);
1047
1063
  const bestEntry = weightedScores[0];
1048
1064
 
1049
- if (currentEntry && bestEntry.route.id !== currentRouteId) {
1050
- if (bestEntry.score < currentEntry.score + switchMargin) {
1065
+ if (bestEntry && bestEntry.route.id !== currentRouteId) {
1066
+ const currentScore = currentEntry ? currentEntry.score : 0;
1067
+
1068
+ if (bestEntry.score < currentScore + switchMargin) {
1069
+ const currentRoute =
1070
+ currentEntry?.route ?? routes.find(r => r.id === currentRouteId);
1071
+ if (currentRoute) {
1072
+ logger.debug(
1073
+ `[FlowRouter] Staying on current flow: ${currentRoute.title} ` +
1074
+ `(current: ${currentScore}, best alternative: ${bestEntry.score}, ` +
1075
+ `margin required: ${switchMargin})`
1076
+ );
1077
+ return currentRoute;
1078
+ }
1051
1079
  logger.debug(
1052
- `[FlowRouter] Staying on current flow: ${currentEntry.route.title} ` +
1053
- `(current: ${currentEntry.score}, best alternative: ${bestEntry.score}, ` +
1054
- `margin required: ${switchMargin})`
1080
+ `[FlowRouter] Current flow ${currentRouteId} is no longer routable — selecting best alternative: ${bestEntry.route.title}`
1081
+ );
1082
+ } else {
1083
+ logger.debug(
1084
+ `[FlowRouter] Switching flow: ${currentEntry?.route.title ?? currentRouteId} → ${bestEntry.route.title} ` +
1085
+ `(current: ${currentScore}, alternative: ${bestEntry.score}, ` +
1086
+ `margin: ${switchMargin})`
1055
1087
  );
1056
- return currentEntry.route;
1057
1088
  }
1058
- logger.debug(
1059
- `[FlowRouter] Switching flow: ${currentEntry.route.title} → ${bestEntry.route.title} ` +
1060
- `(current: ${currentEntry.score}, alternative: ${bestEntry.score}, ` +
1061
- `margin: ${switchMargin})`
1062
- );
1063
1089
  }
1064
1090
  }
1065
1091
 
@@ -17,10 +17,10 @@ import type {
17
17
  History,
18
18
  PersistenceAdapter,
19
19
  CollectedStateData,
20
- } from "../types";
21
- import { createSession, sessionStepToData, sessionDataToStep, logger } from "../utils";
22
- import { SessionConflictError } from "../types/errors";
23
- import { convertMessagesToHistory } from "./Events";
20
+ } from "../types/index.js";
21
+ import { createSession, sessionStepToData, sessionDataToStep, logger } from "../utils/index.js";
22
+ import { SessionConflictError } from "../types/errors.js";
23
+ import { convertMessagesToHistory } from "./Events.js";
24
24
 
25
25
  /**
26
26
  * Manager for handling persistence operations
@@ -1,10 +1,10 @@
1
- import type { Event, Term, Instruction, AgentOptions, ScopedInstructions, AppliedInstruction } from "../types";
2
- import type { Flow } from "./Flow";
3
- import { render, renderMany, formatKnowledgeBase, createTemplateContext } from "../utils/template";
4
- import { TemplateContext } from "../types/template";
5
- import { PromptSectionCache } from "./PromptSectionCache";
6
- import { logger } from "../utils";
7
- import { splitWhenConditions } from "../utils/condition";
1
+ import type { Event, Term, Instruction, AgentOptions, ScopedInstructions, AppliedInstruction } from "../types/index.js";
2
+ import type { Flow } from "./Flow.js";
3
+ import { render, renderMany, formatKnowledgeBase, createTemplateContext } from "../utils/template.js";
4
+ import { TemplateContext } from "../types/template.js";
5
+ import { PromptSectionCache } from "./PromptSectionCache.js";
6
+ import { logger } from "../utils/index.js";
7
+ import { splitWhenConditions } from "../utils/condition.js";
8
8
 
9
9
  export class PromptComposer<TContext = unknown, TData = unknown> {
10
10
  private parts: string[] = [];
@@ -168,7 +168,7 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
168
168
  const result = await predicate({
169
169
  context: (this.renderContext.context ?? {}) as TContext,
170
170
  data: (this.renderContext.data || {}),
171
- session: (this.renderContext.session ?? { id: '', data: {}, history: [], metadata: {} }) as import("../types/session").SessionState<TData>,
171
+ session: (this.renderContext.session ?? { id: '', data: {}, history: [], metadata: {} }) as import("../types/session.js").SessionState<TData>,
172
172
  history: this.renderContext.history || [],
173
173
  });
174
174
  if (!result) return false;
@@ -7,8 +7,8 @@
7
7
  * directives, available tools) are recomputed on every resolveAll() call.
8
8
  */
9
9
 
10
- import type { PromptSectionType, PromptCacheConfig, SectionCompute } from "../types/prompt-cache";
11
- export type { PromptSectionType, PromptCacheConfig, SectionCompute } from "../types/prompt-cache";
10
+ import type { PromptSectionType, PromptCacheConfig, SectionCompute } from "../types/prompt-cache.js";
11
+ export type { PromptSectionType, PromptCacheConfig, SectionCompute } from "../types/prompt-cache.js";
12
12
 
13
13
  /** Internal entry tracking a registered section */
14
14
  interface PromptSectionEntry {
@@ -7,12 +7,12 @@ import type {
7
7
  Template,
8
8
  ScopedInstructions,
9
9
  AppliedInstruction,
10
- } from "../types";
11
- import type { Flow } from "./Flow";
12
- import type { Step } from "./Step";
13
- import { PromptComposer } from "./PromptComposer";
14
- import { PromptSectionCache } from "./PromptSectionCache";
15
- import { createTemplateContext, render } from "../utils/template";
10
+ } from "../types/index.js";
11
+ import type { Flow } from "./Flow.js";
12
+ import type { Step } from "./Step.js";
13
+ import { PromptComposer } from "./PromptComposer.js";
14
+ import { PromptSectionCache } from "./PromptSectionCache.js";
15
+ import { createTemplateContext, render } from "../utils/template.js";
16
16
 
17
17
  export interface BuildResponsePromptParams<
18
18
  TContext = unknown,
@@ -21,13 +21,10 @@ export class ResponseGenerationError extends Error {
21
21
  message: string,
22
22
  public readonly details?: ResponseGenerationErrorDetails
23
23
  ) {
24
- super(message);
24
+ // Native `cause` chain: `err.cause` is the original error, so
25
+ // consumers can reach ProviderError.code etc. without string matching.
26
+ super(message, { cause: details?.originalError });
25
27
  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
28
  }
32
29
 
33
30
  /**
@@ -7,6 +7,7 @@ import type {
7
7
  AgentOptions,
8
8
  AgentResponse,
9
9
  AgentResponseStreamChunk,
10
+ EndedFlow,
10
11
  History,
11
12
  SessionState,
12
13
  StepRef,
@@ -22,27 +23,30 @@ import type {
22
23
  Term,
23
24
  StructuredSchema,
24
25
  CompactionOptions,
25
- } from "../types";
26
- import type { SignalFiring } from "../types/signals";
27
- import type { SessionManager } from "./SessionManager";
28
- import type { SignalProcessor } from "./SignalProcessor";
29
- import type { PromptSectionCache } from "./PromptSectionCache";
30
- import type { FlowRouter } from "./FlowRouter";
31
- import type { PersistenceManager } from "./PersistenceManager";
32
- import type { Flow } from "./Flow";
33
- import { Step } from "./Step";
34
- import { ResponseEngine } from "./ResponseEngine";
35
- import { ResponsePipeline } from "./ResponsePipeline";
36
- import { AutoChainExecutor, type AutoChainResult } from "./AutoChainExecutor";
37
- import { StepLifecycle } from "./StepLifecycle";
38
- import { SessionFinalizer } from "./SessionFinalizer";
39
- import { ToolLoopExecutor } from "./ToolLoopExecutor";
40
- import { SignalCoordinator } from "./SignalCoordinator";
41
- import { ResponseGenerationError } from "./ResponseGenerationError";
42
- import { cloneDeep, mergeCollected, logger, historyToEvents, completeCurrentFlow, render } from "../utils";
43
- import { createTemplateContext } from "../utils/template";
44
- import { StreamingMessageDecoder } from "../utils/streamingMessage";
45
- import type { ToolManager } from "./ToolManager";
26
+ } from "../types/index.js";
27
+ import type { SignalFiring } from "../types/signals.js";
28
+ import type { SessionManager } from "./SessionManager.js";
29
+ import type { SignalProcessor } from "./SignalProcessor.js";
30
+ import type { PromptSectionCache } from "./PromptSectionCache.js";
31
+ import type { FlowRouter } from "./FlowRouter.js";
32
+ import type { PersistenceManager } from "./PersistenceManager.js";
33
+ import type { Flow } from "./Flow.js";
34
+ import { Step } from "./Step.js";
35
+ import { ResponseEngine } from "./ResponseEngine.js";
36
+ import { ResponsePipeline } from "./ResponsePipeline.js";
37
+ import { AutoChainExecutor, type AutoChainResult } from "./AutoChainExecutor.js";
38
+ import { StepLifecycle } from "./StepLifecycle.js";
39
+ import { SessionFinalizer } from "./SessionFinalizer.js";
40
+ import { ToolLoopExecutor } from "./ToolLoopExecutor.js";
41
+ import { flow } from "./flow-namespace.js";
42
+ import { SignalCoordinator } from "./SignalCoordinator.js";
43
+ import { ResponseGenerationError } from "./ResponseGenerationError.js";
44
+ import { ProviderError, SessionConflictError } from "../types/errors.js";
45
+ import { cloneDeep, mergeCollected, logger, historyToEvents, completeCurrentFlow, render, userMessage, assistantMessage } from "../utils/index.js";
46
+ import { createTemplateContext } from "../utils/template.js";
47
+ import { StreamingMessageDecoder } from "../utils/streamingMessage.js";
48
+ import { tryParseJSONResponse } from "../utils/json.js";
49
+ import type { ToolManager } from "./ToolManager.js";
46
50
 
47
51
  /**
48
52
  * The narrow surface ResponseModal (and its collaborators) need from the
@@ -95,6 +99,19 @@ export interface ResponseModalOptions {
95
99
  */
96
100
  export interface RespondParams<TContext = unknown, TData = unknown> extends Record<string, unknown> {
97
101
  history: History;
102
+ /**
103
+ * The user's message for this turn. When set, the engine appends it to the
104
+ * generation history AND to the returned session's history, then appends
105
+ * the assistant reply on top — callers who hold sessions no longer need to
106
+ * maintain history arrays by hand.
107
+ */
108
+ message?: string;
109
+ /**
110
+ * Restrict this turn's ROUTING candidates to these flow ids/titles.
111
+ * Directive targets (goTo etc.) still resolve against the full registry.
112
+ * Use for entry-pin funnels instead of cloning/filtering agents.
113
+ */
114
+ allowedFlows?: string[];
98
115
  step?: StepRef;
99
116
  session?: SessionState<TData>;
100
117
  contextOverride?: Partial<TContext>;
@@ -140,6 +157,10 @@ interface ResponseContext<TContext = unknown, TData = unknown> {
140
157
  signalHalted?: boolean;
141
158
  /** Reply from a halt directive. */
142
159
  signalHaltReply?: string;
160
+ /** Flows exited via pendingDirective redirects/resets during routing. */
161
+ endedFlows?: EndedFlow[];
162
+ /** The user turn supplied via params.message (drives history ownership). */
163
+ turnMessage?: string;
143
164
  }
144
165
 
145
166
  /**
@@ -261,6 +282,13 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
261
282
  if (preTurnSession) {
262
283
  this.agent.session.syncSession(preTurnSession);
263
284
  }
285
+ // Typed library errors carry their own semantics (ProviderError.code,
286
+ // SessionConflictError) — rethrow bare so consumers can branch on
287
+ // them instead of string-matching. Everything else wraps with the
288
+ // original attached as `cause`.
289
+ if (error instanceof ProviderError || error instanceof SessionConflictError) {
290
+ throw error;
291
+ }
264
292
  throw new ResponseGenerationError(
265
293
  `[ResponseGenerationError] Response generation failed: ${error instanceof Error ? error.message : String(error)}. ` +
266
294
  `Check provider configuration and network connectivity.`,
@@ -430,6 +458,58 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
430
458
  return this.agent.tool;
431
459
  }
432
460
 
461
+ /**
462
+ * Repair-parse a JSON-shaped protocol fragment (truncated output,
463
+ * fence-wrapped JSON) into a structured payload. Raw protocol fragments
464
+ * must never surface as the user-visible reply: if the repair parse fails,
465
+ * fail the turn LOUDLY so the caller's rollback/retry path engages instead
466
+ * of leaking `{"message": "…` to an end user. Plain prose (not JSON-shaped
467
+ * at all) never reaches this helper — the call sites gate on the fragment
468
+ * shape and pass it through untouched.
469
+ */
470
+ private salvageStructuredOutput(
471
+ raw: string,
472
+ surface: "turn" | "stream"
473
+ ): AgentStructuredResponse {
474
+ const salvaged = tryParseJSONResponse(raw) as Partial<AgentStructuredResponse> | undefined;
475
+ if (salvaged && typeof salvaged.message === "string") {
476
+ logger.warn(`[ResponseModal] Salvaged malformed structured output from ${surface} via JSON repair parse.`);
477
+ return { ...salvaged, message: salvaged.message };
478
+ }
479
+ throw ResponseGenerationError.fromError(
480
+ new Error(
481
+ "Model returned a schema-mandated response that could not be parsed as JSON. " +
482
+ `The ${surface} was failed instead of delivering raw protocol output to the user.`
483
+ ),
484
+ 'structured_output_malformed',
485
+ { responseSchemaName: 'response_output' }
486
+ );
487
+ }
488
+
489
+ /**
490
+ * Tool-emitted directives (ctx.dispatch / `{directive}` returns): state
491
+ * writes apply now; control flow queues for the next turn's
492
+ * pendingDirective applier (same deferred semantics as dispatch()).
493
+ */
494
+ private async applyToolEmittedDirectives(
495
+ session: SessionState<TData>,
496
+ d: Directive<TContext, TData>
497
+ ): Promise<SessionState<TData>> {
498
+ if (d.dataUpdate) {
499
+ session = mergeCollected(session, d.dataUpdate);
500
+ }
501
+ if (d.contextUpdate) {
502
+ await this.agent.updateContext(d.contextUpdate);
503
+ }
504
+ const control = { ...d };
505
+ delete control.dataUpdate;
506
+ delete control.contextUpdate;
507
+ if (Object.keys(control).length > 0) {
508
+ flow.queuePending(session, control);
509
+ }
510
+ return session;
511
+ }
512
+
433
513
  /**
434
514
  * Collect scoped instructions from agent, flow, and step into a ScopedInstructions value.
435
515
  * @private
@@ -455,21 +535,25 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
455
535
  */
456
536
  private async prepareUnifiedResponseContext(params: RespondParams<TContext, TData>): Promise<ResponseContext<TContext, TData>> {
457
537
  try {
458
- const { history: simpleHistory, contextOverride, signal } = params;
538
+ const { history: simpleHistory, contextOverride, signal, message: turnMessage, allowedFlows } = params;
459
539
 
460
540
  // Validate input parameters
461
541
  if (!simpleHistory) {
462
542
  throw new ResponseGenerationError(
463
543
  '[ResponseGenerationError] Missing history: history is required for response generation. ' +
464
- 'Pass a valid history array to the respond/stream method.',
544
+ 'Pass a valid history array (or pass `message` alongside an existing history base).',
465
545
  { params, phase: 'validation' }
466
546
  );
467
547
  }
468
548
 
549
+ // `message` is the user turn: appended to what the model sees this
550
+ // turn AND recorded on the returned session's history.
551
+ const history = turnMessage
552
+ ? [...simpleHistory, userMessage(turnMessage)]
553
+ : simpleHistory;
554
+
469
555
  // Convert HistoryItem[] to Event[] for internal processing
470
- const historyEvents = historyToEvents(simpleHistory);
471
- // Keep original HistoryItem[] format for external APIs
472
- const history = simpleHistory;
556
+ const historyEvents = historyToEvents(history);
473
557
 
474
558
  // Use ResponsePipeline for context and session preparation; context
475
559
  // and session are passed explicitly — the pipeline holds no state
@@ -515,9 +599,23 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
515
599
  }
516
600
  }
517
601
 
602
+ // Record the user turn on the session's own history so the returned
603
+ // session carries the full exchange (respond owns session.history
604
+ // when `message` is used).
605
+ if (turnMessage) {
606
+ session.history = [...(session.history ?? []), userMessage(turnMessage)];
607
+ }
608
+
518
609
  // PHASE 1: PREPARE - Execute prepare function if current step has one
519
610
  try {
520
- await this.stepLifecycle.runPrepare(session, effectiveContext);
611
+ const prepareDirective = await this.stepLifecycle.runPrepare(session, effectiveContext);
612
+ // Queue the control-flow directive for THIS turn: routing
613
+ // (handleRoutingAndStepSelection) consumes session.pendingDirective
614
+ // before deciding flow/step, so a prepare-phase goTo/goToStep/
615
+ // reset steers the current turn.
616
+ if (prepareDirective) {
617
+ flow.queuePending(session, prepareDirective);
618
+ }
521
619
  } catch (error) {
522
620
  throw ResponseGenerationError.fromError(error, 'step_preparation', params, { session, effectiveContext });
523
621
  }
@@ -534,6 +632,7 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
534
632
  signalPreDirective?: Directive<TContext, TData>;
535
633
  signalHalted?: boolean;
536
634
  signalHaltReply?: string;
635
+ endedFlows?: EndedFlow[];
537
636
  };
538
637
  try {
539
638
  routingResult = await this.responsePipeline.routeAndSelectStep({
@@ -541,6 +640,7 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
541
640
  history: historyEvents,
542
641
  context: effectiveContext,
543
642
  signal,
643
+ allowedFlows,
544
644
  });
545
645
  } catch (error) {
546
646
  throw ResponseGenerationError.fromError(error, 'routing_and_step_selection', params, { session, effectiveContext });
@@ -550,6 +650,7 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
550
650
  effectiveContext,
551
651
  session: routingResult.session,
552
652
  history,
653
+ turnMessage,
553
654
  selectedFlow: routingResult.selectedFlow,
554
655
  selectedStep: routingResult.selectedStep,
555
656
  responseDirectives: routingResult.responseDirectives,
@@ -559,6 +660,7 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
559
660
  signalPreDirective: routingResult.signalPreDirective,
560
661
  signalHalted: routingResult.signalHalted,
561
662
  signalHaltReply: routingResult.signalHaltReply,
663
+ endedFlows: routingResult.endedFlows,
562
664
  };
563
665
  } catch (error) {
564
666
  // Re-throw ResponseGenerationError as-is, wrap others
@@ -748,6 +850,8 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
748
850
  let isFlowComplete = false;
749
851
  let appliedInstructions: AppliedInstruction[] | undefined;
750
852
  let runPostPhase = true;
853
+ let tokensUsed: number | undefined;
854
+ const endedFlows: EndedFlow[] = [...(responseContext.endedFlows ?? [])];
751
855
 
752
856
  switch (plan.outcome.kind) {
753
857
  case 'halt': {
@@ -765,6 +869,11 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
765
869
  });
766
870
  isFlowComplete = true;
767
871
  stoppedReason = plan.outcome.stoppedReason;
872
+ endedFlows.push({
873
+ flowId: plan.outcome.selectedFlow.id,
874
+ title: plan.outcome.selectedFlow.title,
875
+ reason: plan.outcome.stoppedReason,
876
+ });
768
877
  break;
769
878
  }
770
879
  case 'flowStep': {
@@ -786,6 +895,7 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
786
895
  toolCalls = result.toolCalls;
787
896
  session = result.session;
788
897
  appliedInstructions = result.appliedInstructions;
898
+ tokensUsed = result.tokensUsed;
789
899
  if (plan.outcome.step) {
790
900
  executedSteps = [{ id: plan.outcome.step.id, flowId: plan.outcome.selectedFlow.id }];
791
901
  }
@@ -811,6 +921,14 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
811
921
  session, context: effectiveContext, historyEvents, message, signalFirings, runPostPhase,
812
922
  });
813
923
 
924
+ // History ownership: with params.message the returned session carries
925
+ // the full exchange — the user turn was recorded pre-routing, the
926
+ // assistant tail lands here (post-phase, so overridden replies are the
927
+ // ones recorded). Empty tails are skipped.
928
+ if (responseContext.turnMessage && tail.message) {
929
+ tail.session.history = [...(tail.session.history ?? []), assistantMessage(tail.message)];
930
+ }
931
+
814
932
  return {
815
933
  message: tail.message,
816
934
  session: tail.session,
@@ -820,6 +938,8 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
820
938
  stoppedReason,
821
939
  appliedInstructions,
822
940
  triggeredSignals: tail.triggeredSignals,
941
+ ...(tokensUsed !== undefined ? { metadata: { tokensUsed } } : {}),
942
+ ...(endedFlows.length > 0 ? { endedFlows } : {}),
823
943
  };
824
944
  }
825
945
 
@@ -852,6 +972,8 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
852
972
  session: SessionState<TData>;
853
973
  appliedInstructions?: AppliedInstruction[];
854
974
  stoppedReason?: StoppedReason;
975
+ /** Provider-reported usage for the primary generation call. */
976
+ tokensUsed?: number;
855
977
  }> {
856
978
  const { selectedFlow, selectedStep, responseDirectives, history, context, historyEvents, signal, transientAppendage, mergedPreDirective } = params;
857
979
  let session = params.session;
@@ -940,17 +1062,25 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
940
1062
  parameters: responseSchema ? { jsonSchema: responseSchema, schemaName: "response_output" } : undefined,
941
1063
  });
942
1064
 
943
- let message = result.structured?.message || result.message;
944
- let toolCalls = result.structured?.toolCalls;
1065
+ let structuredData = result.structured;
1066
+ let message = structuredData?.message || result.message;
1067
+ const tokensUsed = result.metadata?.tokensUsed;
1068
+
1069
+ // A schema was requested but the provider failed to parse the model's
1070
+ // JSON (truncated output, fence-wrapped fragments). Raw protocol
1071
+ // fragments must never surface as the user-visible reply: attempt one
1072
+ // repair-parse, and if that fails fail the turn LOUDLY so the caller's
1073
+ // rollback/retry path engages instead of leaking `{"message": "…` to
1074
+ // an end user. Plain prose (not JSON-shaped at all) still passes
1075
+ // through — it is not a protocol fragment.
1076
+ if (!structuredData && responseSchema && message && /^\s*(```|{)/.test(message)) {
1077
+ const salvaged = this.salvageStructuredOutput(message, "turn");
1078
+ structuredData = salvaged;
1079
+ message = salvaged.message;
1080
+ }
945
1081
 
946
- // Debug: Log initial AI response
947
- logger.debug(`[ResponseModal] Initial AI response:`, {
948
- hasMessage: !!message,
949
- messageLength: message?.length || 0,
950
- hasToolCalls: !!toolCalls,
951
- toolCallsCount: toolCalls?.length || 0,
952
- toolNames: toolCalls?.map(tc => tc.toolName) || [],
953
- });
1082
+ const effectiveResult = structuredData ? { ...result, structured: structuredData } : result;
1083
+ let toolCalls = structuredData?.toolCalls;
954
1084
 
955
1085
  // Execute tools with unified loop handling
956
1086
  const toolResult = await this.toolLoopExecutor.runLoop({
@@ -971,14 +1101,21 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
971
1101
  message = toolResult.finalMessage;
972
1102
  }
973
1103
 
1104
+ // Tool-emitted directives (ctx.dispatch / `{directive}` returns):
1105
+ // state writes apply now; control flow queues for the next turn's
1106
+ // pendingDirective applier (same deferred semantics as dispatch()).
1107
+ if (toolResult.directives) {
1108
+ session = await this.applyToolEmittedDirectives(session, toolResult.directives);
1109
+ }
1110
+
974
1111
  // Collect data from response
975
1112
  // Use follow-up structured data from tool loop when available, fall back to original result
976
1113
  const dataSource = toolResult.structured
977
1114
  ? { structured: toolResult.structured }
978
- : result;
1115
+ : effectiveResult;
979
1116
  session = await this.collectDataFromResponse({ result: dataSource, selectedFlow, nextStep, session });
980
1117
 
981
- return { message, toolCalls, session, appliedInstructions };
1118
+ return { message, toolCalls, session, appliedInstructions, tokensUsed };
982
1119
  } finally {
983
1120
  // Drain the transient appendage at end of turn.
984
1121
  // This ensures Directive.appendPrompt does not leak to subsequent
@@ -1070,6 +1207,14 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
1070
1207
  const accumulated = tail.message;
1071
1208
  const delta = tail.replyOverridden ? accumulated : chunk.delta;
1072
1209
 
1210
+ // History ownership (parity with the sync tail): with
1211
+ // params.message the returned session carries the full
1212
+ // exchange — the user turn was recorded pre-routing, the
1213
+ // assistant tail lands here, BEFORE finalize persists it.
1214
+ if (responseContext.turnMessage && tail.message) {
1215
+ tail.session.history = [...(tail.session.history ?? []), assistantMessage(tail.message)];
1216
+ }
1217
+
1073
1218
  // Single streaming exit: finalize the post-phase session so
1074
1219
  // post-signal mutations (e.g. pendingDirective) are persisted.
1075
1220
  await this.sessionFinalizer.finalize(tail.session, effectiveContext);
@@ -1291,6 +1436,15 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
1291
1436
  session = batchResult.session;
1292
1437
  toolCalls = batchResult.toolCalls;
1293
1438
 
1439
+ // Tool-emitted directives (ctx.dispatch / `{directive}`):
1440
+ // state writes apply now; control flow queues for the next
1441
+ // turn's pendingDirective applier (same deferred semantics
1442
+ // as dispatch()). A verbatim tool reply already replaced the
1443
+ // closing message inside runStreamingBatch.
1444
+ if (batchResult.directives) {
1445
+ session = await this.applyToolEmittedDirectives(session, batchResult.directives);
1446
+ }
1447
+
1294
1448
  // Prefer the post-tool follow-up structured for collection and
1295
1449
  // emission whenever present — independent of whether a closing
1296
1450
  // message was forced — matching the non-streaming path's
@@ -1309,6 +1463,18 @@ export class ResponseModal<TContext = unknown, TData = unknown> {
1309
1463
  }
1310
1464
  }
1311
1465
 
1466
+ // Streaming twin of the non-streaming salvage guard: a schema was
1467
+ // requested but no structured payload arrived, and the accumulated
1468
+ // text is JSON-shaped (a protocol fragment) — repair-parse it or
1469
+ // fail the turn rather than leaking raw output to the user.
1470
+ if (chunk.done && !finalStructured && responseSchema && finalAccumulated && /^\s*(```|{)/.test(finalAccumulated)) {
1471
+ const salvaged = this.salvageStructuredOutput(finalAccumulated, "stream");
1472
+ finalStructured = salvaged;
1473
+ finalDelta = salvaged.message.startsWith(finalAccumulated)
1474
+ ? salvaged.message.slice(finalAccumulated.length)
1475
+ : salvaged.message;
1476
+ }
1477
+
1312
1478
  // Collect data on the final chunk for any flow step — flow
1313
1479
  // required/optional fields are valid targets even without a step
1314
1480
  // `collect` — preferring the post-tool follow-up structured so a