@falai/agent 0.8.1 → 0.9.0-alpha-2

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 (665) hide show
  1. package/README.md +332 -147
  2. package/dist/{adapters → cjs/src/adapters}/MemoryAdapter.d.ts +4 -4
  3. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
  4. package/dist/cjs/{adapters → src/adapters}/MemoryAdapter.js +41 -21
  5. package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
  6. package/dist/{adapters → cjs/src/adapters}/MongoAdapter.d.ts +3 -3
  7. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
  8. package/dist/cjs/{adapters → src/adapters}/MongoAdapter.js +2 -1
  9. package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
  10. package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
  11. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  12. package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
  13. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
  14. package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
  15. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  16. package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
  17. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
  18. package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
  19. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
  20. package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.js +35 -5
  21. package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
  22. package/dist/cjs/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
  23. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
  24. package/dist/cjs/{adapters → src/adapters}/RedisAdapter.js +3 -2
  25. package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
  26. package/dist/{adapters → cjs/src/adapters}/SQLiteAdapter.d.ts +3 -3
  27. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  28. package/dist/cjs/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
  29. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
  30. package/dist/cjs/src/adapters/index.d.ts.map +1 -0
  31. package/dist/cjs/src/adapters/index.js.map +1 -0
  32. package/dist/cjs/src/constants/index.d.ts.map +1 -0
  33. package/dist/cjs/src/constants/index.js.map +1 -0
  34. package/dist/cjs/src/core/Agent.d.ts +223 -0
  35. package/dist/cjs/src/core/Agent.d.ts.map +1 -0
  36. package/dist/cjs/src/core/Agent.js +1660 -0
  37. package/dist/cjs/src/core/Agent.js.map +1 -0
  38. package/dist/cjs/src/core/Events.d.ts +26 -0
  39. package/dist/cjs/src/core/Events.d.ts.map +1 -0
  40. package/dist/cjs/src/core/Events.js +144 -0
  41. package/dist/cjs/src/core/Events.js.map +1 -0
  42. package/dist/{core → cjs/src/core}/PersistenceManager.d.ts +21 -19
  43. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  44. package/dist/cjs/{core → src/core}/PersistenceManager.js +73 -20
  45. package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
  46. package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
  47. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
  48. package/dist/cjs/src/core/PromptComposer.js +157 -0
  49. package/dist/cjs/src/core/PromptComposer.js.map +1 -0
  50. package/dist/cjs/src/core/ResponseEngine.d.ts +32 -0
  51. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
  52. package/dist/cjs/src/core/ResponseEngine.js +84 -0
  53. package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
  54. package/dist/cjs/src/core/ResponsePipeline.d.ts +171 -0
  55. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
  56. package/dist/cjs/src/core/ResponsePipeline.js +514 -0
  57. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
  58. package/dist/cjs/src/core/Route.d.ts +145 -0
  59. package/dist/cjs/src/core/Route.d.ts.map +1 -0
  60. package/dist/cjs/src/core/Route.js +343 -0
  61. package/dist/cjs/src/core/Route.js.map +1 -0
  62. package/dist/cjs/src/core/RoutingEngine.d.ts +129 -0
  63. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
  64. package/dist/cjs/{core → src/core}/RoutingEngine.js +215 -117
  65. package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
  66. package/dist/cjs/src/core/SessionManager.d.ts +86 -0
  67. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
  68. package/dist/cjs/src/core/SessionManager.js +217 -0
  69. package/dist/cjs/src/core/SessionManager.js.map +1 -0
  70. package/dist/cjs/src/core/Step.d.ts +96 -0
  71. package/dist/cjs/src/core/Step.d.ts.map +1 -0
  72. package/dist/cjs/src/core/Step.js +206 -0
  73. package/dist/cjs/src/core/Step.js.map +1 -0
  74. package/dist/cjs/src/core/ToolExecutor.d.ts +45 -0
  75. package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
  76. package/dist/cjs/{core → src/core}/ToolExecutor.js +30 -19
  77. package/dist/cjs/src/core/ToolExecutor.js.map +1 -0
  78. package/dist/{index.d.ts → cjs/src/index.d.ts} +7 -15
  79. package/dist/cjs/src/index.d.ts.map +1 -0
  80. package/dist/cjs/{index.js → src/index.js} +21 -19
  81. package/dist/cjs/src/index.js.map +1 -0
  82. package/dist/cjs/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
  83. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
  84. package/dist/cjs/{providers → src/providers}/AnthropicProvider.js +54 -2
  85. package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
  86. package/dist/{providers → cjs/src/providers}/GeminiProvider.d.ts +1 -1
  87. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
  88. package/dist/cjs/{providers → src/providers}/GeminiProvider.js +65 -0
  89. package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
  90. package/dist/cjs/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
  91. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
  92. package/dist/cjs/{providers → src/providers}/OpenAIProvider.js +70 -1
  93. package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
  94. package/dist/{providers → cjs/src/providers}/OpenRouterProvider.d.ts +1 -1
  95. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
  96. package/dist/cjs/{providers → src/providers}/OpenRouterProvider.js +76 -0
  97. package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
  98. package/dist/cjs/src/providers/index.d.ts.map +1 -0
  99. package/dist/cjs/src/providers/index.js.map +1 -0
  100. package/dist/cjs/{types → src/types}/agent.d.ts +80 -41
  101. package/dist/cjs/src/types/agent.d.ts.map +1 -0
  102. package/dist/cjs/src/types/agent.js.map +1 -0
  103. package/dist/cjs/{types → src/types}/ai.d.ts +7 -0
  104. package/dist/cjs/src/types/ai.d.ts.map +1 -0
  105. package/dist/cjs/src/types/ai.js.map +1 -0
  106. package/dist/{types → cjs/src/types}/history.d.ts +76 -18
  107. package/dist/cjs/src/types/history.d.ts.map +1 -0
  108. package/dist/cjs/src/types/history.js +33 -0
  109. package/dist/cjs/src/types/history.js.map +1 -0
  110. package/dist/cjs/src/types/index.d.ts +20 -0
  111. package/dist/cjs/src/types/index.d.ts.map +1 -0
  112. package/dist/cjs/src/types/index.js +30 -0
  113. package/dist/cjs/src/types/index.js.map +1 -0
  114. package/dist/{types → cjs/src/types}/persistence.d.ts +38 -23
  115. package/dist/cjs/src/types/persistence.d.ts.map +1 -0
  116. package/dist/cjs/src/types/persistence.js.map +1 -0
  117. package/dist/cjs/src/types/route.d.ts +235 -0
  118. package/dist/cjs/src/types/route.d.ts.map +1 -0
  119. package/dist/cjs/{types → src/types}/route.js.map +1 -1
  120. package/dist/cjs/src/types/routing.d.ts.map +1 -0
  121. package/dist/{types → cjs/src/types}/routing.js.map +1 -1
  122. package/dist/cjs/src/types/schema.d.ts.map +1 -0
  123. package/dist/{types → cjs/src/types}/schema.js.map +1 -1
  124. package/dist/cjs/src/types/session.d.ts +65 -0
  125. package/dist/cjs/src/types/session.d.ts.map +1 -0
  126. package/dist/cjs/src/types/session.js +6 -0
  127. package/dist/cjs/src/types/session.js.map +1 -0
  128. package/dist/cjs/src/types/template.d.ts +30 -0
  129. package/dist/cjs/src/types/template.d.ts.map +1 -0
  130. package/dist/cjs/src/types/template.js +3 -0
  131. package/dist/cjs/src/types/template.js.map +1 -0
  132. package/dist/{types → cjs/src/types}/tool.d.ts +17 -13
  133. package/dist/cjs/src/types/tool.d.ts.map +1 -0
  134. package/dist/cjs/{types → src/types}/tool.js.map +1 -1
  135. package/dist/cjs/src/utils/clone.d.ts +8 -0
  136. package/dist/cjs/src/utils/clone.d.ts.map +1 -0
  137. package/dist/cjs/src/utils/clone.js +36 -0
  138. package/dist/cjs/src/utils/clone.js.map +1 -0
  139. package/dist/{utils → cjs/src/utils}/event.d.ts +1 -1
  140. package/dist/cjs/src/utils/event.d.ts.map +1 -0
  141. package/dist/cjs/{utils → src/utils}/event.js +2 -2
  142. package/dist/cjs/src/utils/event.js.map +1 -0
  143. package/dist/cjs/src/utils/history.d.ts +31 -0
  144. package/dist/cjs/src/utils/history.d.ts.map +1 -0
  145. package/dist/cjs/src/utils/history.js +128 -0
  146. package/dist/cjs/src/utils/history.js.map +1 -0
  147. package/dist/cjs/src/utils/id.d.ts.map +1 -0
  148. package/dist/cjs/src/utils/id.js.map +1 -0
  149. package/dist/cjs/src/utils/index.d.ts +13 -0
  150. package/dist/cjs/src/utils/index.d.ts.map +1 -0
  151. package/dist/cjs/src/utils/index.js +49 -0
  152. package/dist/cjs/src/utils/index.js.map +1 -0
  153. package/dist/cjs/src/utils/logger.d.ts.map +1 -0
  154. package/dist/cjs/src/utils/logger.js.map +1 -0
  155. package/dist/cjs/src/utils/retry.d.ts.map +1 -0
  156. package/dist/cjs/src/utils/retry.js.map +1 -0
  157. package/dist/cjs/src/utils/session.d.ts +51 -0
  158. package/dist/cjs/src/utils/session.d.ts.map +1 -0
  159. package/dist/cjs/{types → src/utils}/session.js +35 -32
  160. package/dist/cjs/src/utils/session.js.map +1 -0
  161. package/dist/cjs/src/utils/template.d.ts +107 -0
  162. package/dist/cjs/src/utils/template.d.ts.map +1 -0
  163. package/dist/cjs/src/utils/template.js +283 -0
  164. package/dist/cjs/src/utils/template.js.map +1 -0
  165. package/dist/{cjs → src}/adapters/MemoryAdapter.d.ts +4 -4
  166. package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
  167. package/dist/{adapters → src/adapters}/MemoryAdapter.js +41 -21
  168. package/dist/src/adapters/MemoryAdapter.js.map +1 -0
  169. package/dist/{cjs → src}/adapters/MongoAdapter.d.ts +3 -3
  170. package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
  171. package/dist/{adapters → src/adapters}/MongoAdapter.js +2 -1
  172. package/dist/src/adapters/MongoAdapter.js.map +1 -0
  173. package/dist/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
  174. package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  175. package/dist/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
  176. package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
  177. package/dist/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
  178. package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  179. package/dist/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
  180. package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
  181. package/dist/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
  182. package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
  183. package/dist/{adapters → src/adapters}/PrismaAdapter.js +35 -5
  184. package/dist/src/adapters/PrismaAdapter.js.map +1 -0
  185. package/dist/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
  186. package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
  187. package/dist/{adapters → src/adapters}/RedisAdapter.js +3 -2
  188. package/dist/src/adapters/RedisAdapter.js.map +1 -0
  189. package/dist/{cjs → src}/adapters/SQLiteAdapter.d.ts +3 -3
  190. package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  191. package/dist/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
  192. package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
  193. package/dist/src/adapters/index.js.map +1 -0
  194. package/dist/src/constants/index.js.map +1 -0
  195. package/dist/src/core/Agent.d.ts +223 -0
  196. package/dist/src/core/Agent.d.ts.map +1 -0
  197. package/dist/src/core/Agent.js +1656 -0
  198. package/dist/src/core/Agent.js.map +1 -0
  199. package/dist/src/core/Events.d.ts +26 -0
  200. package/dist/src/core/Events.d.ts.map +1 -0
  201. package/dist/src/core/Events.js +137 -0
  202. package/dist/src/core/Events.js.map +1 -0
  203. package/dist/{cjs → src}/core/PersistenceManager.d.ts +21 -19
  204. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  205. package/dist/{core → src/core}/PersistenceManager.js +71 -18
  206. package/dist/src/core/PersistenceManager.js.map +1 -0
  207. package/dist/src/core/PromptComposer.d.ts +27 -0
  208. package/dist/src/core/PromptComposer.d.ts.map +1 -0
  209. package/dist/src/core/PromptComposer.js +153 -0
  210. package/dist/src/core/PromptComposer.js.map +1 -0
  211. package/dist/src/core/ResponseEngine.d.ts +32 -0
  212. package/dist/src/core/ResponseEngine.d.ts.map +1 -0
  213. package/dist/src/core/ResponseEngine.js +80 -0
  214. package/dist/src/core/ResponseEngine.js.map +1 -0
  215. package/dist/src/core/ResponsePipeline.d.ts +171 -0
  216. package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
  217. package/dist/src/core/ResponsePipeline.js +510 -0
  218. package/dist/src/core/ResponsePipeline.js.map +1 -0
  219. package/dist/src/core/Route.d.ts +145 -0
  220. package/dist/src/core/Route.d.ts.map +1 -0
  221. package/dist/src/core/Route.js +339 -0
  222. package/dist/src/core/Route.js.map +1 -0
  223. package/dist/src/core/RoutingEngine.d.ts +129 -0
  224. package/dist/src/core/RoutingEngine.d.ts.map +1 -0
  225. package/dist/{core → src/core}/RoutingEngine.js +211 -113
  226. package/dist/src/core/RoutingEngine.js.map +1 -0
  227. package/dist/src/core/SessionManager.d.ts +86 -0
  228. package/dist/src/core/SessionManager.d.ts.map +1 -0
  229. package/dist/src/core/SessionManager.js +213 -0
  230. package/dist/src/core/SessionManager.js.map +1 -0
  231. package/dist/src/core/Step.d.ts +96 -0
  232. package/dist/src/core/Step.d.ts.map +1 -0
  233. package/dist/src/core/Step.js +202 -0
  234. package/dist/src/core/Step.js.map +1 -0
  235. package/dist/src/core/ToolExecutor.d.ts +45 -0
  236. package/dist/src/core/ToolExecutor.d.ts.map +1 -0
  237. package/dist/src/core/ToolExecutor.js +80 -0
  238. package/dist/src/core/ToolExecutor.js.map +1 -0
  239. package/dist/{cjs → src}/index.d.ts +7 -15
  240. package/dist/src/index.d.ts.map +1 -0
  241. package/dist/{index.js → src/index.js} +6 -7
  242. package/dist/src/index.js.map +1 -0
  243. package/dist/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
  244. package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
  245. package/dist/{providers → src/providers}/AnthropicProvider.js +54 -2
  246. package/dist/src/providers/AnthropicProvider.js.map +1 -0
  247. package/dist/{cjs → src}/providers/GeminiProvider.d.ts +1 -1
  248. package/dist/{cjs → src}/providers/GeminiProvider.d.ts.map +1 -1
  249. package/dist/{providers → src/providers}/GeminiProvider.js +65 -0
  250. package/dist/src/providers/GeminiProvider.js.map +1 -0
  251. package/dist/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
  252. package/dist/{cjs → src}/providers/OpenAIProvider.d.ts.map +1 -1
  253. package/dist/{providers → src/providers}/OpenAIProvider.js +70 -1
  254. package/dist/src/providers/OpenAIProvider.js.map +1 -0
  255. package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts +1 -1
  256. package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts.map +1 -1
  257. package/dist/{providers → src/providers}/OpenRouterProvider.js +76 -0
  258. package/dist/src/providers/OpenRouterProvider.js.map +1 -0
  259. package/dist/src/providers/index.js.map +1 -0
  260. package/dist/{types → src/types}/agent.d.ts +80 -41
  261. package/dist/src/types/agent.d.ts.map +1 -0
  262. package/dist/src/types/agent.js.map +1 -0
  263. package/dist/{types → src/types}/ai.d.ts +7 -0
  264. package/dist/src/types/ai.d.ts.map +1 -0
  265. package/dist/{cjs → src}/types/ai.js.map +1 -1
  266. package/dist/{cjs → src}/types/history.d.ts +76 -18
  267. package/dist/src/types/history.d.ts.map +1 -0
  268. package/dist/src/types/history.js +30 -0
  269. package/dist/src/types/history.js.map +1 -0
  270. package/dist/src/types/index.d.ts +20 -0
  271. package/dist/src/types/index.d.ts.map +1 -0
  272. package/dist/src/types/index.js +10 -0
  273. package/dist/src/types/index.js.map +1 -0
  274. package/dist/{cjs → src}/types/persistence.d.ts +38 -23
  275. package/dist/src/types/persistence.d.ts.map +1 -0
  276. package/dist/src/types/persistence.js.map +1 -0
  277. package/dist/src/types/route.d.ts +235 -0
  278. package/dist/src/types/route.d.ts.map +1 -0
  279. package/dist/{types → src/types}/route.js.map +1 -1
  280. package/dist/src/types/session.d.ts +65 -0
  281. package/dist/src/types/session.d.ts.map +1 -0
  282. package/dist/src/types/session.js +5 -0
  283. package/dist/src/types/session.js.map +1 -0
  284. package/dist/src/types/template.d.ts +30 -0
  285. package/dist/src/types/template.d.ts.map +1 -0
  286. package/dist/src/types/template.js +2 -0
  287. package/dist/src/types/template.js.map +1 -0
  288. package/dist/{cjs → src}/types/tool.d.ts +17 -13
  289. package/dist/src/types/tool.d.ts.map +1 -0
  290. package/dist/{types → src/types}/tool.js.map +1 -1
  291. package/dist/src/utils/clone.d.ts +8 -0
  292. package/dist/src/utils/clone.d.ts.map +1 -0
  293. package/dist/src/utils/clone.js +33 -0
  294. package/dist/src/utils/clone.js.map +1 -0
  295. package/dist/{cjs → src}/utils/event.d.ts +1 -1
  296. package/dist/{cjs → src}/utils/event.d.ts.map +1 -1
  297. package/dist/{utils → src/utils}/event.js +1 -1
  298. package/dist/src/utils/event.js.map +1 -0
  299. package/dist/src/utils/history.d.ts +31 -0
  300. package/dist/src/utils/history.d.ts.map +1 -0
  301. package/dist/src/utils/history.js +121 -0
  302. package/dist/src/utils/history.js.map +1 -0
  303. package/dist/src/utils/id.js.map +1 -0
  304. package/dist/src/utils/index.d.ts +13 -0
  305. package/dist/src/utils/index.d.ts.map +1 -0
  306. package/dist/src/utils/index.js +19 -0
  307. package/dist/src/utils/index.js.map +1 -0
  308. package/dist/src/utils/logger.js.map +1 -0
  309. package/dist/src/utils/retry.js.map +1 -0
  310. package/dist/src/utils/session.d.ts +51 -0
  311. package/dist/src/utils/session.d.ts.map +1 -0
  312. package/dist/{types → src/utils}/session.js +33 -32
  313. package/dist/src/utils/session.js.map +1 -0
  314. package/dist/src/utils/template.d.ts +107 -0
  315. package/dist/src/utils/template.d.ts.map +1 -0
  316. package/dist/src/utils/template.js +276 -0
  317. package/dist/src/utils/template.js.map +1 -0
  318. package/docs/README.md +174 -68
  319. package/docs/{API_REFERENCE.md → api/README.md} +925 -255
  320. package/docs/api/overview.md +952 -0
  321. package/docs/core/agent/README.md +787 -0
  322. package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +175 -102
  323. package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +117 -69
  324. package/docs/core/ai-integration/prompt-composition.md +220 -0
  325. package/docs/core/ai-integration/providers.md +515 -0
  326. package/docs/core/ai-integration/response-processing.md +176 -0
  327. package/docs/core/conversation-flows/data-collection.md +623 -0
  328. package/docs/core/conversation-flows/route-dsl.md +502 -0
  329. package/docs/core/conversation-flows/routes.md +117 -0
  330. package/docs/core/conversation-flows/step-transitions.md +595 -0
  331. package/docs/core/conversation-flows/steps.md +154 -0
  332. package/docs/{ADAPTERS.md → core/persistence/adapters.md} +1 -1
  333. package/docs/core/persistence/session-storage.md +644 -0
  334. package/docs/core/routing/intelligent-routing.md +348 -0
  335. package/docs/core/tools/tool-definition.md +346 -0
  336. package/docs/core/tools/tool-execution.md +815 -0
  337. package/docs/core/tools/tool-scoping.md +628 -0
  338. package/docs/guides/getting-started/README.md +406 -0
  339. package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +139 -95
  340. package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +244 -137
  341. package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +130 -84
  342. package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +116 -90
  343. package/examples/ai-providers/anthropic-integration.ts +384 -0
  344. package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +57 -63
  345. package/examples/conversation-flows/completion-transitions.ts +277 -0
  346. package/examples/core-concepts/basic-agent.ts +443 -0
  347. package/examples/core-concepts/schema-driven-extraction.ts +305 -0
  348. package/examples/core-concepts/session-management.ts +406 -0
  349. package/examples/integrations/database-integration.ts +630 -0
  350. package/examples/integrations/healthcare-integration.ts +609 -0
  351. package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +199 -171
  352. package/examples/integrations/server-session-management.ts +307 -0
  353. package/examples/persistence/custom-adapter.ts +529 -0
  354. package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +215 -272
  355. package/examples/persistence/memory-sessions.ts +495 -0
  356. package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
  357. package/examples/persistence/redis-persistence.ts +490 -0
  358. package/examples/tools/basic-tools.ts +561 -0
  359. package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +128 -117
  360. package/package.json +14 -10
  361. package/src/adapters/MemoryAdapter.ts +74 -46
  362. package/src/adapters/MongoAdapter.ts +33 -24
  363. package/src/adapters/OpenSearchAdapter.ts +41 -37
  364. package/src/adapters/PostgreSQLAdapter.ts +35 -24
  365. package/src/adapters/PrismaAdapter.ts +69 -27
  366. package/src/adapters/RedisAdapter.ts +38 -26
  367. package/src/adapters/SQLiteAdapter.ts +32 -22
  368. package/src/core/Agent.ts +1431 -526
  369. package/src/core/Events.ts +100 -112
  370. package/src/core/PersistenceManager.ts +103 -49
  371. package/src/core/PromptComposer.ts +158 -85
  372. package/src/core/ResponseEngine.ts +128 -46
  373. package/src/core/ResponsePipeline.ts +830 -0
  374. package/src/core/Route.ts +222 -53
  375. package/src/core/RoutingEngine.ts +345 -229
  376. package/src/core/SessionManager.ts +265 -0
  377. package/src/core/Step.ts +157 -67
  378. package/src/core/ToolExecutor.ts +52 -43
  379. package/src/index.ts +31 -37
  380. package/src/providers/AnthropicProvider.ts +71 -5
  381. package/src/providers/GeminiProvider.ts +83 -2
  382. package/src/providers/OpenAIProvider.ts +95 -3
  383. package/src/providers/OpenRouterProvider.ts +102 -2
  384. package/src/types/agent.ts +81 -46
  385. package/src/types/ai.ts +7 -0
  386. package/src/types/history.ts +91 -18
  387. package/src/types/index.ts +45 -7
  388. package/src/types/persistence.ts +45 -28
  389. package/src/types/route.ts +122 -57
  390. package/src/types/session.ts +20 -220
  391. package/src/types/template.ts +36 -0
  392. package/src/types/tool.ts +23 -19
  393. package/src/utils/clone.ts +36 -0
  394. package/src/utils/event.ts +1 -1
  395. package/src/utils/history.ts +143 -0
  396. package/src/utils/index.ts +53 -0
  397. package/src/utils/session.ts +204 -0
  398. package/src/utils/template.ts +335 -0
  399. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  400. package/dist/adapters/MemoryAdapter.js.map +0 -1
  401. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  402. package/dist/adapters/MongoAdapter.js.map +0 -1
  403. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  404. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  405. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  406. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  407. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  408. package/dist/adapters/PrismaAdapter.js.map +0 -1
  409. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  410. package/dist/adapters/RedisAdapter.js.map +0 -1
  411. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  412. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  413. package/dist/adapters/index.d.ts.map +0 -1
  414. package/dist/adapters/index.js.map +0 -1
  415. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  416. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  417. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  418. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  419. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  420. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  421. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  422. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  423. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  424. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  425. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  426. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  427. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  428. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  429. package/dist/cjs/adapters/index.js.map +0 -1
  430. package/dist/cjs/constants/index.js.map +0 -1
  431. package/dist/cjs/core/Agent.d.ts +0 -197
  432. package/dist/cjs/core/Agent.d.ts.map +0 -1
  433. package/dist/cjs/core/Agent.js +0 -966
  434. package/dist/cjs/core/Agent.js.map +0 -1
  435. package/dist/cjs/core/DomainRegistry.d.ts +0 -36
  436. package/dist/cjs/core/DomainRegistry.d.ts.map +0 -1
  437. package/dist/cjs/core/DomainRegistry.js +0 -72
  438. package/dist/cjs/core/DomainRegistry.js.map +0 -1
  439. package/dist/cjs/core/Events.d.ts +0 -41
  440. package/dist/cjs/core/Events.d.ts.map +0 -1
  441. package/dist/cjs/core/Events.js +0 -99
  442. package/dist/cjs/core/Events.js.map +0 -1
  443. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  444. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  445. package/dist/cjs/core/PromptComposer.d.ts +0 -24
  446. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  447. package/dist/cjs/core/PromptComposer.js +0 -127
  448. package/dist/cjs/core/PromptComposer.js.map +0 -1
  449. package/dist/cjs/core/ResponseEngine.d.ts +0 -14
  450. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  451. package/dist/cjs/core/ResponseEngine.js +0 -56
  452. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  453. package/dist/cjs/core/Route.d.ts +0 -90
  454. package/dist/cjs/core/Route.d.ts.map +0 -1
  455. package/dist/cjs/core/Route.js +0 -203
  456. package/dist/cjs/core/Route.js.map +0 -1
  457. package/dist/cjs/core/RoutingEngine.d.ts +0 -109
  458. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  459. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  460. package/dist/cjs/core/Step.d.ts +0 -72
  461. package/dist/cjs/core/Step.d.ts.map +0 -1
  462. package/dist/cjs/core/Step.js +0 -150
  463. package/dist/cjs/core/Step.js.map +0 -1
  464. package/dist/cjs/core/Tool.d.ts +0 -39
  465. package/dist/cjs/core/Tool.d.ts.map +0 -1
  466. package/dist/cjs/core/Tool.js +0 -34
  467. package/dist/cjs/core/Tool.js.map +0 -1
  468. package/dist/cjs/core/ToolExecutor.d.ts +0 -29
  469. package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
  470. package/dist/cjs/core/ToolExecutor.js.map +0 -1
  471. package/dist/cjs/core/Transition.d.ts +0 -32
  472. package/dist/cjs/core/Transition.d.ts.map +0 -1
  473. package/dist/cjs/core/Transition.js +0 -89
  474. package/dist/cjs/core/Transition.js.map +0 -1
  475. package/dist/cjs/index.d.ts.map +0 -1
  476. package/dist/cjs/index.js.map +0 -1
  477. package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
  478. package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
  479. package/dist/cjs/providers/GeminiProvider.js.map +0 -1
  480. package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
  481. package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
  482. package/dist/cjs/providers/index.js.map +0 -1
  483. package/dist/cjs/types/agent.d.ts.map +0 -1
  484. package/dist/cjs/types/agent.js.map +0 -1
  485. package/dist/cjs/types/ai.d.ts.map +0 -1
  486. package/dist/cjs/types/history.d.ts.map +0 -1
  487. package/dist/cjs/types/history.js +0 -37
  488. package/dist/cjs/types/history.js.map +0 -1
  489. package/dist/cjs/types/index.d.ts +0 -12
  490. package/dist/cjs/types/index.d.ts.map +0 -1
  491. package/dist/cjs/types/index.js +0 -12
  492. package/dist/cjs/types/index.js.map +0 -1
  493. package/dist/cjs/types/persistence.d.ts.map +0 -1
  494. package/dist/cjs/types/persistence.js.map +0 -1
  495. package/dist/cjs/types/route.d.ts +0 -175
  496. package/dist/cjs/types/route.d.ts.map +0 -1
  497. package/dist/cjs/types/session.d.ts +0 -104
  498. package/dist/cjs/types/session.d.ts.map +0 -1
  499. package/dist/cjs/types/session.js.map +0 -1
  500. package/dist/cjs/types/tool.d.ts.map +0 -1
  501. package/dist/cjs/utils/event.js.map +0 -1
  502. package/dist/cjs/utils/id.js.map +0 -1
  503. package/dist/cjs/utils/logger.js.map +0 -1
  504. package/dist/cjs/utils/retry.js.map +0 -1
  505. package/dist/constants/index.d.ts.map +0 -1
  506. package/dist/constants/index.js.map +0 -1
  507. package/dist/core/Agent.d.ts +0 -197
  508. package/dist/core/Agent.d.ts.map +0 -1
  509. package/dist/core/Agent.js +0 -962
  510. package/dist/core/Agent.js.map +0 -1
  511. package/dist/core/DomainRegistry.d.ts +0 -36
  512. package/dist/core/DomainRegistry.d.ts.map +0 -1
  513. package/dist/core/DomainRegistry.js +0 -68
  514. package/dist/core/DomainRegistry.js.map +0 -1
  515. package/dist/core/Events.d.ts +0 -41
  516. package/dist/core/Events.d.ts.map +0 -1
  517. package/dist/core/Events.js +0 -94
  518. package/dist/core/Events.js.map +0 -1
  519. package/dist/core/PersistenceManager.d.ts.map +0 -1
  520. package/dist/core/PersistenceManager.js.map +0 -1
  521. package/dist/core/PromptComposer.d.ts +0 -24
  522. package/dist/core/PromptComposer.d.ts.map +0 -1
  523. package/dist/core/PromptComposer.js +0 -123
  524. package/dist/core/PromptComposer.js.map +0 -1
  525. package/dist/core/ResponseEngine.d.ts +0 -14
  526. package/dist/core/ResponseEngine.d.ts.map +0 -1
  527. package/dist/core/ResponseEngine.js +0 -52
  528. package/dist/core/ResponseEngine.js.map +0 -1
  529. package/dist/core/Route.d.ts +0 -90
  530. package/dist/core/Route.d.ts.map +0 -1
  531. package/dist/core/Route.js +0 -199
  532. package/dist/core/Route.js.map +0 -1
  533. package/dist/core/RoutingEngine.d.ts +0 -109
  534. package/dist/core/RoutingEngine.d.ts.map +0 -1
  535. package/dist/core/RoutingEngine.js.map +0 -1
  536. package/dist/core/Step.d.ts +0 -72
  537. package/dist/core/Step.d.ts.map +0 -1
  538. package/dist/core/Step.js +0 -146
  539. package/dist/core/Step.js.map +0 -1
  540. package/dist/core/Tool.d.ts +0 -39
  541. package/dist/core/Tool.d.ts.map +0 -1
  542. package/dist/core/Tool.js +0 -31
  543. package/dist/core/Tool.js.map +0 -1
  544. package/dist/core/ToolExecutor.d.ts +0 -29
  545. package/dist/core/ToolExecutor.d.ts.map +0 -1
  546. package/dist/core/ToolExecutor.js +0 -69
  547. package/dist/core/ToolExecutor.js.map +0 -1
  548. package/dist/core/Transition.d.ts +0 -32
  549. package/dist/core/Transition.d.ts.map +0 -1
  550. package/dist/core/Transition.js +0 -85
  551. package/dist/core/Transition.js.map +0 -1
  552. package/dist/index.d.ts.map +0 -1
  553. package/dist/index.js.map +0 -1
  554. package/dist/providers/AnthropicProvider.d.ts.map +0 -1
  555. package/dist/providers/AnthropicProvider.js.map +0 -1
  556. package/dist/providers/GeminiProvider.d.ts.map +0 -1
  557. package/dist/providers/GeminiProvider.js.map +0 -1
  558. package/dist/providers/OpenAIProvider.d.ts.map +0 -1
  559. package/dist/providers/OpenAIProvider.js.map +0 -1
  560. package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
  561. package/dist/providers/OpenRouterProvider.js.map +0 -1
  562. package/dist/providers/index.d.ts.map +0 -1
  563. package/dist/providers/index.js.map +0 -1
  564. package/dist/types/agent.d.ts.map +0 -1
  565. package/dist/types/agent.js.map +0 -1
  566. package/dist/types/ai.d.ts.map +0 -1
  567. package/dist/types/ai.js.map +0 -1
  568. package/dist/types/history.d.ts.map +0 -1
  569. package/dist/types/history.js +0 -34
  570. package/dist/types/history.js.map +0 -1
  571. package/dist/types/index.d.ts +0 -12
  572. package/dist/types/index.d.ts.map +0 -1
  573. package/dist/types/index.js +0 -6
  574. package/dist/types/index.js.map +0 -1
  575. package/dist/types/persistence.d.ts.map +0 -1
  576. package/dist/types/persistence.js.map +0 -1
  577. package/dist/types/route.d.ts +0 -175
  578. package/dist/types/route.d.ts.map +0 -1
  579. package/dist/types/routing.d.ts.map +0 -1
  580. package/dist/types/schema.d.ts.map +0 -1
  581. package/dist/types/session.d.ts +0 -104
  582. package/dist/types/session.d.ts.map +0 -1
  583. package/dist/types/session.js.map +0 -1
  584. package/dist/types/tool.d.ts.map +0 -1
  585. package/dist/utils/event.d.ts.map +0 -1
  586. package/dist/utils/event.js.map +0 -1
  587. package/dist/utils/id.d.ts.map +0 -1
  588. package/dist/utils/id.js.map +0 -1
  589. package/dist/utils/logger.d.ts.map +0 -1
  590. package/dist/utils/logger.js.map +0 -1
  591. package/dist/utils/retry.d.ts.map +0 -1
  592. package/dist/utils/retry.js.map +0 -1
  593. package/docs/AGENT.md +0 -535
  594. package/docs/DOCS.md +0 -263
  595. package/docs/DOMAINS.md +0 -735
  596. package/docs/EXAMPLES.md +0 -467
  597. package/docs/GETTING_STARTED.md +0 -424
  598. package/docs/PERSISTENCE.md +0 -815
  599. package/docs/PROVIDERS.md +0 -612
  600. package/docs/ROUTES.md +0 -1085
  601. package/docs/STEPS.md +0 -883
  602. package/examples/business-onboarding.ts +0 -791
  603. package/examples/custom-database-persistence.ts +0 -574
  604. package/examples/declarative-agent.ts +0 -401
  605. package/examples/domain-scoping.ts +0 -366
  606. package/examples/healthcare-agent.ts +0 -511
  607. package/examples/redis-persistence.ts +0 -525
  608. package/examples/route-transitions.ts +0 -266
  609. package/examples/travel-agent.ts +0 -584
  610. package/src/core/DomainRegistry.ts +0 -80
  611. package/src/core/Tool.ts +0 -112
  612. package/src/core/Transition.ts +0 -115
  613. /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
  614. /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
  615. /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
  616. /package/dist/cjs/{constants → src/constants}/index.js +0 -0
  617. /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
  618. /package/dist/cjs/{providers → src/providers}/index.js +0 -0
  619. /package/dist/cjs/{types → src/types}/agent.js +0 -0
  620. /package/dist/cjs/{types → src/types}/ai.js +0 -0
  621. /package/dist/cjs/{types → src/types}/persistence.js +0 -0
  622. /package/dist/cjs/{types → src/types}/route.js +0 -0
  623. /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
  624. /package/dist/cjs/{types → src/types}/routing.js +0 -0
  625. /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
  626. /package/dist/cjs/{types → src/types}/schema.js +0 -0
  627. /package/dist/cjs/{types → src/types}/tool.js +0 -0
  628. /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
  629. /package/dist/cjs/{utils → src/utils}/id.js +0 -0
  630. /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
  631. /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
  632. /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
  633. /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
  634. /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
  635. /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
  636. /package/dist/{adapters → src/adapters}/index.js +0 -0
  637. /package/dist/{constants → src/constants}/index.d.ts +0 -0
  638. /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
  639. /package/dist/{constants → src/constants}/index.js +0 -0
  640. /package/dist/{providers → src/providers}/index.d.ts +0 -0
  641. /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
  642. /package/dist/{providers → src/providers}/index.js +0 -0
  643. /package/dist/{types → src/types}/agent.js +0 -0
  644. /package/dist/{types → src/types}/ai.js +0 -0
  645. /package/dist/{types → src/types}/persistence.js +0 -0
  646. /package/dist/{types → src/types}/route.js +0 -0
  647. /package/dist/{types → src/types}/routing.d.ts +0 -0
  648. /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
  649. /package/dist/{types → src/types}/routing.js +0 -0
  650. /package/dist/{cjs → src}/types/routing.js.map +0 -0
  651. /package/dist/{types → src/types}/schema.d.ts +0 -0
  652. /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
  653. /package/dist/{types → src/types}/schema.js +0 -0
  654. /package/dist/{cjs → src}/types/schema.js.map +0 -0
  655. /package/dist/{types → src/types}/tool.js +0 -0
  656. /package/dist/{utils → src/utils}/id.d.ts +0 -0
  657. /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
  658. /package/dist/{utils → src/utils}/id.js +0 -0
  659. /package/dist/{utils → src/utils}/logger.d.ts +0 -0
  660. /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
  661. /package/dist/{utils → src/utils}/logger.js +0 -0
  662. /package/dist/{utils → src/utils}/retry.d.ts +0 -0
  663. /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
  664. /package/dist/{utils → src/utils}/retry.js +0 -0
  665. /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
@@ -0,0 +1,830 @@
1
+ /**
2
+ * Response processing utilities shared between respond() and respondStream() methods
3
+ */
4
+
5
+ import type {
6
+ AgentOptions,
7
+ Event,
8
+ SessionState,
9
+ AgentStructuredResponse,
10
+ Tool,
11
+ RouteTransitionConfig,
12
+ } from "../types";
13
+ import { EventKind, MessageRole } from "../types/history";
14
+ import {
15
+ createSession,
16
+ enterRoute,
17
+ enterStep,
18
+ mergeCollected,
19
+ logger,
20
+ render,
21
+ } from "../utils";
22
+ import { Route } from "../core/Route";
23
+ import { Step } from "../core/Step";
24
+ import { RoutingEngine } from "../core/RoutingEngine";
25
+ import { ToolExecutor } from "../core/ToolExecutor";
26
+ import { END_ROUTE_ID } from "../constants";
27
+
28
+ export interface ResponsePreparationResult<TContext, TData = unknown> {
29
+ effectiveContext: TContext;
30
+ session: SessionState<TData>;
31
+ }
32
+
33
+ export interface RoutingResult<TContext, TData = unknown> {
34
+ selectedRoute: Route<TContext, TData> | undefined;
35
+ selectedStep: Step<TContext, TData> | undefined;
36
+ responseDirectives: string[] | undefined;
37
+ session: SessionState<TData>;
38
+ isRouteComplete: boolean;
39
+ completedRoutes?: Route<TContext, TData>[];
40
+ }
41
+
42
+ export interface ToolExecutionResult<TData = unknown> {
43
+ session: SessionState<TData>;
44
+ toolCalls:
45
+ | Array<{ toolName: string; arguments: Record<string, unknown> }>
46
+ | undefined;
47
+ }
48
+
49
+ export interface DataCollectionResult<TData = unknown> {
50
+ session: SessionState<TData>;
51
+ collectedData?: Partial<TData>;
52
+ }
53
+
54
+ /**
55
+ * Shared response processing logic between respond() and respondStream() methods
56
+ */
57
+ export class ResponsePipeline<TContext = unknown, TData = unknown> {
58
+ constructor(
59
+ private readonly options: AgentOptions<TContext, TData>,
60
+ private readonly routes: Route<TContext, TData>[],
61
+ private readonly tools: Tool<TContext, TData, unknown[], unknown>[],
62
+ private readonly routingEngine: RoutingEngine<TContext, TData>,
63
+ private readonly updateContext: (
64
+ updates: Partial<TContext>
65
+ ) => Promise<void>,
66
+ private readonly updateData: (
67
+ session: SessionState<TData>,
68
+ dataUpdate: Partial<TData>
69
+ ) => Promise<SessionState<TData>>,
70
+ private readonly updateCollectedData?: (
71
+ updates: Partial<TData>
72
+ ) => Promise<void>
73
+ ) {}
74
+
75
+ /**
76
+ * Prepare context and session for response generation
77
+ */
78
+ async prepareResponseContext(params: {
79
+ contextOverride?: Partial<TContext>;
80
+ session?: SessionState<TData>;
81
+ }): Promise<ResponsePreparationResult<TContext, TData>> {
82
+ const { contextOverride, session } = params;
83
+
84
+ // Get current context (may fetch from provider)
85
+ let currentContext = await this.getContext();
86
+
87
+ // Call beforeRespond hook if configured
88
+ if (this.options.hooks?.beforeRespond && currentContext !== undefined) {
89
+ currentContext = await this.options.hooks.beforeRespond(currentContext);
90
+ // Update stored context with the result from beforeRespond
91
+ this.context = currentContext;
92
+ }
93
+
94
+ // Merge context with override
95
+ const effectiveContext = {
96
+ ...(currentContext as Record<string, unknown>),
97
+ ...(contextOverride as Record<string, unknown>),
98
+ } as TContext;
99
+
100
+ // Initialize or get session (use current session if available)
101
+ const targetSession = session || this.currentSession || createSession<TData>();
102
+
103
+ return {
104
+ effectiveContext,
105
+ session: targetSession,
106
+ };
107
+ }
108
+
109
+ /**
110
+ * Handle routing and step selection logic
111
+ */
112
+ async handleRoutingAndStepSelection(params: {
113
+ session: SessionState<TData>;
114
+ history: Event[];
115
+ context: TContext;
116
+ signal?: AbortSignal;
117
+ }): Promise<RoutingResult<TContext, TData>> {
118
+ const { session, history, context, signal } = params;
119
+
120
+ // PHASE 2: ROUTING + STEP SELECTION - Determine which route and step to use (combined)
121
+ let selectedRoute: Route<TContext, TData> | undefined;
122
+ let responseDirectives: string[] | undefined;
123
+ let selectedStep: Step<TContext, TData> | undefined;
124
+ let isRouteComplete = false;
125
+ let completedRoutes: Route<TContext, TData>[] = [];
126
+ let targetSession = session;
127
+
128
+ // Check for pending transition from previous route completion
129
+ if (targetSession.pendingTransition) {
130
+ const targetRoute = this.routes.find(
131
+ (r) => r.id === targetSession.pendingTransition?.targetRouteId
132
+ );
133
+
134
+ if (targetRoute) {
135
+ logger.debug(
136
+ `[ResponseHandler] Auto-transitioning from pending transition to route: ${targetRoute.title}`
137
+ );
138
+ // Clear pending transition and enter new route
139
+ targetSession = {
140
+ ...targetSession,
141
+ pendingTransition: undefined,
142
+ };
143
+ targetSession = enterRoute(
144
+ targetSession,
145
+ targetRoute.id,
146
+ targetRoute.title
147
+ );
148
+
149
+ // Merge initial data if available
150
+ if (targetRoute.initialData) {
151
+ targetSession = mergeCollected(
152
+ targetSession,
153
+ targetRoute.initialData
154
+ );
155
+ }
156
+
157
+ selectedRoute = targetRoute;
158
+ } else {
159
+ logger.warn(
160
+ `[ResponseHandler] Pending transition target route not found: ${targetSession.pendingTransition.targetRouteId}`
161
+ );
162
+ // Clear invalid transition
163
+ targetSession = {
164
+ ...targetSession,
165
+ pendingTransition: undefined,
166
+ };
167
+ }
168
+ }
169
+
170
+ // If no pending transition or transition handled, do normal routing
171
+ if (this.routes.length > 0 && !selectedRoute) {
172
+ const orchestration = await this.routingEngine.decideRouteAndStep({
173
+ routes: this.routes,
174
+ session: targetSession,
175
+ history,
176
+ agentOptions: this.options,
177
+ provider: this.options.provider,
178
+ context,
179
+ signal,
180
+ });
181
+
182
+ selectedRoute = orchestration.selectedRoute;
183
+ selectedStep = orchestration.selectedStep;
184
+ responseDirectives = orchestration.responseDirectives;
185
+ targetSession = orchestration.session;
186
+ isRouteComplete = orchestration.isRouteComplete || false;
187
+ completedRoutes = orchestration.completedRoutes || [];
188
+
189
+ // Log if route is complete
190
+ if (isRouteComplete) {
191
+ logger.debug(
192
+ `[ResponseHandler] Route complete: all required data collected, END_ROUTE reached`
193
+ );
194
+ }
195
+ }
196
+
197
+ return {
198
+ selectedRoute,
199
+ selectedStep,
200
+ responseDirectives,
201
+ session: targetSession,
202
+ isRouteComplete,
203
+ completedRoutes,
204
+ };
205
+ }
206
+
207
+ /**
208
+ * Determine next step and update session
209
+ */
210
+ determineNextStep(params: {
211
+ selectedRoute: Route<TContext, TData> | undefined;
212
+ selectedStep: Step<TContext, TData> | undefined;
213
+ session: SessionState<TData>;
214
+ isRouteComplete: boolean;
215
+ }): { nextStep: Step<TContext, TData> | undefined; session: SessionState<TData> } {
216
+ const { selectedRoute, selectedStep, session, isRouteComplete } = params;
217
+
218
+ if (!selectedRoute || isRouteComplete) {
219
+ return { nextStep: undefined, session };
220
+ }
221
+
222
+ let nextStep: Step<TContext, TData>;
223
+
224
+ // If we have a selected step from the combined routing decision, use it
225
+ if (selectedStep) {
226
+ nextStep = selectedStep;
227
+ } else {
228
+ // New route or no step selected - get initial step or first valid step
229
+ const candidates = this.routingEngine.getCandidateSteps(
230
+ selectedRoute,
231
+ undefined,
232
+ session.data || {}
233
+ );
234
+ if (candidates.length > 0) {
235
+ nextStep = candidates[0].step;
236
+ logger.debug(
237
+ `[ResponseHandler] Using first valid step: ${nextStep.id} for new route`
238
+ );
239
+ } else {
240
+ // Fallback to initial step even if it should be skipped
241
+ nextStep = selectedRoute.initialStep;
242
+ logger.warn(
243
+ `[ResponseHandler] No valid steps found, using initial step: ${nextStep.id}`
244
+ );
245
+ }
246
+ }
247
+
248
+ // Update session with next step
249
+ const updatedSession = enterStep(
250
+ session,
251
+ nextStep.id,
252
+ nextStep.description
253
+ );
254
+ logger.debug(`[ResponseHandler] Entered step: ${nextStep.id}`);
255
+
256
+ return { nextStep, session: updatedSession };
257
+ }
258
+
259
+ /**
260
+ * Execute tool calls and handle results
261
+ */
262
+ async executeToolCalls(params: {
263
+ toolCalls: Array<{ toolName: string; arguments: Record<string, unknown> }>;
264
+ selectedRoute?: Route<TContext, TData>;
265
+ context: TContext;
266
+ session: SessionState<TData>;
267
+ history: Event[];
268
+ isStreaming?: boolean;
269
+ }): Promise<ToolExecutionResult<TData>> {
270
+ const {
271
+ toolCalls,
272
+ selectedRoute,
273
+ context,
274
+ session,
275
+ history,
276
+ isStreaming = false,
277
+ } = params;
278
+
279
+ if (toolCalls.length === 0) {
280
+ return { session, toolCalls: undefined };
281
+ }
282
+
283
+ logger.debug(
284
+ `[ResponseHandler] Executing ${toolCalls.length} ${
285
+ isStreaming ? "streaming " : ""
286
+ }tool calls`
287
+ );
288
+
289
+ let updatedSession = session;
290
+ const executedToolCalls: Array<{
291
+ toolName: string;
292
+ arguments: Record<string, unknown>;
293
+ }> = [];
294
+
295
+ for (const toolCall of toolCalls) {
296
+ const tool = this.findAvailableTool(toolCall.toolName, selectedRoute);
297
+ if (!tool) {
298
+ logger.warn(`[ResponseHandler] Tool not found: ${toolCall.toolName}`);
299
+ continue;
300
+ }
301
+
302
+ const toolExecutor = new ToolExecutor<TContext, TData>();
303
+ const result = await toolExecutor.executeTool({
304
+ tool,
305
+ context,
306
+ updateContext: this.updateContext,
307
+ updateData: this.updateCollectedData || (async () => {}),
308
+ history,
309
+ data: updatedSession.data,
310
+ });
311
+
312
+ executedToolCalls.push(toolCall);
313
+
314
+ // Update context with tool results
315
+ if (result.contextUpdate) {
316
+ await this.updateContext(result.contextUpdate as Partial<TContext>);
317
+ }
318
+
319
+ // Update collected data with tool results
320
+ if (result.dataUpdate) {
321
+ updatedSession = await this.updateData(
322
+ updatedSession,
323
+ result.dataUpdate as Partial<TData>
324
+ );
325
+ logger.debug(
326
+ `[ResponseHandler] ${
327
+ isStreaming ? "Streaming " : ""
328
+ }Tool updated collected data:`,
329
+ result.dataUpdate
330
+ );
331
+ }
332
+
333
+ logger.debug(
334
+ `[ResponseHandler] Executed ${isStreaming ? "streaming " : ""}tool: ${
335
+ result.toolName
336
+ } (success: ${result.success})`
337
+ );
338
+ }
339
+
340
+ return {
341
+ session: updatedSession,
342
+ toolCalls: executedToolCalls.length > 0 ? executedToolCalls : undefined,
343
+ };
344
+ }
345
+
346
+ /**
347
+ * Execute tool loop for follow-up tool calls
348
+ */
349
+ async executeToolLoop(params: {
350
+ initialToolCalls:
351
+ | Array<{ toolName: string; arguments: Record<string, unknown> }>
352
+ | undefined;
353
+ selectedRoute?: Route<TContext, TData>;
354
+ nextStep: Step<TContext, TData>;
355
+ responsePrompt: string;
356
+ history: Event[];
357
+ context: TContext;
358
+ session: SessionState<TData>;
359
+ responseSchema: Record<string, unknown>;
360
+ isStreaming?: boolean;
361
+ }): Promise<ToolExecutionResult<TData>> {
362
+ const {
363
+ initialToolCalls,
364
+ selectedRoute,
365
+ nextStep,
366
+ responsePrompt,
367
+ history,
368
+ context,
369
+ session,
370
+ responseSchema,
371
+ isStreaming = false,
372
+ } = params;
373
+
374
+ const MAX_TOOL_LOOPS = 5;
375
+ let toolLoopCount = 0;
376
+ let currentToolCalls = initialToolCalls;
377
+ let hasToolCalls = currentToolCalls && currentToolCalls.length > 0;
378
+ let currentSession = session;
379
+
380
+ while (hasToolCalls && toolLoopCount < MAX_TOOL_LOOPS) {
381
+ toolLoopCount++;
382
+ logger.debug(
383
+ `[ResponseHandler] Starting ${
384
+ isStreaming ? "streaming " : ""
385
+ }tool loop ${toolLoopCount}/${MAX_TOOL_LOOPS}`
386
+ );
387
+
388
+ // Add tool execution results to history so AI knows what happened
389
+ const toolResultsEvents: Event[] = [];
390
+ for (const toolCall of currentToolCalls || []) {
391
+ const tool = this.findAvailableTool(toolCall.toolName, selectedRoute);
392
+ if (tool) {
393
+ toolResultsEvents.push({
394
+ kind: EventKind.TOOL,
395
+ source: MessageRole.AGENT,
396
+ timestamp: new Date().toISOString(),
397
+ data: {
398
+ tool_calls: [
399
+ {
400
+ tool_id: toolCall.toolName,
401
+ arguments: toolCall.arguments,
402
+ result: {
403
+ data: "Tool executed successfully",
404
+ },
405
+ },
406
+ ],
407
+ },
408
+ });
409
+ }
410
+ }
411
+
412
+ // Create updated history with tool results
413
+ const updatedHistory = [...history, ...toolResultsEvents];
414
+
415
+ // Make follow-up AI call to see if more tools are needed
416
+ const followUpResult = await this.options.provider.generateMessage({
417
+ prompt: responsePrompt,
418
+ history: updatedHistory,
419
+ context,
420
+ tools: this.collectAvailableTools(selectedRoute, nextStep),
421
+ parameters: {
422
+ jsonSchema: responseSchema,
423
+ schemaName: isStreaming ? "tool_followup_streaming" : "tool_followup",
424
+ },
425
+ });
426
+
427
+ // Check if follow-up call has more tool calls
428
+ const followUpToolCalls = followUpResult.structured?.toolCalls;
429
+ hasToolCalls = followUpToolCalls && followUpToolCalls.length > 0;
430
+
431
+ if (hasToolCalls) {
432
+ logger.debug(
433
+ `[ResponseHandler] Follow-up call produced ${
434
+ followUpToolCalls!.length
435
+ } additional tool calls`
436
+ );
437
+
438
+ // Execute the follow-up tool calls
439
+ const toolResult = await this.executeToolCalls({
440
+ toolCalls: followUpToolCalls!,
441
+ selectedRoute,
442
+ context,
443
+ session: currentSession,
444
+ history: updatedHistory,
445
+ isStreaming,
446
+ });
447
+
448
+ currentSession = toolResult.session;
449
+ currentToolCalls = followUpToolCalls;
450
+ } else {
451
+ logger.debug(
452
+ `[ResponseHandler] ${
453
+ isStreaming ? "Streaming " : ""
454
+ }Tool loop completed after ${toolLoopCount} iterations`
455
+ );
456
+ // Update final toolCalls from follow-up result if no more tools
457
+ currentToolCalls = followUpToolCalls || [];
458
+ break;
459
+ }
460
+ }
461
+
462
+ if (toolLoopCount >= MAX_TOOL_LOOPS) {
463
+ logger.warn(
464
+ `[ResponseHandler] ${
465
+ isStreaming ? "Streaming " : ""
466
+ }Tool loop limit reached (${MAX_TOOL_LOOPS}), stopping`
467
+ );
468
+ }
469
+
470
+ return {
471
+ session: currentSession,
472
+ toolCalls: currentToolCalls,
473
+ };
474
+ }
475
+
476
+ /**
477
+ * Handle data collection from structured response
478
+ */
479
+ async handleDataCollection(params: {
480
+ structured: AgentStructuredResponse | undefined;
481
+ nextStep: Step<TContext, TData>;
482
+ session: SessionState<TData>;
483
+ }): Promise<DataCollectionResult<TData>> {
484
+ const { structured, nextStep, session } = params;
485
+
486
+ if (!structured || !nextStep.collect) {
487
+ return { session };
488
+ }
489
+
490
+ const collectedData: Partial<TData> = {};
491
+ // The structured response includes both base fields and collected extraction fields
492
+ const structuredData = structured as AgentStructuredResponse &
493
+ Record<string, unknown>;
494
+
495
+ for (const field of nextStep.collect) {
496
+ const fieldKey = field as string;
497
+ if (fieldKey in structuredData) {
498
+ (collectedData as Record<string, unknown>)[fieldKey] = structuredData[fieldKey];
499
+ }
500
+ }
501
+
502
+ let updatedSession = session;
503
+ if (Object.keys(collectedData).length > 0) {
504
+ // Update agent-level collected data with validation if available
505
+ if (this.updateCollectedData) {
506
+ await this.updateCollectedData(collectedData);
507
+ }
508
+
509
+ // Update session with validated data
510
+ updatedSession = await this.updateData(session, collectedData);
511
+ logger.debug(`[ResponseHandler] Collected data:`, collectedData);
512
+ }
513
+
514
+ return {
515
+ session: updatedSession,
516
+ collectedData,
517
+ };
518
+ }
519
+
520
+ /**
521
+ * Handle context updates from structured response
522
+ */
523
+ async handleContextUpdate(
524
+ structured: AgentStructuredResponse | undefined
525
+ ): Promise<void> {
526
+ if (
527
+ structured &&
528
+ typeof structured === "object" &&
529
+ "contextUpdate" in structured
530
+ ) {
531
+ await this.updateContext(
532
+ (structured as { contextUpdate?: Partial<TContext> })
533
+ .contextUpdate as Partial<TContext>
534
+ );
535
+ }
536
+ }
537
+
538
+ /**
539
+ * Handle route completion logic
540
+ */
541
+ async handleRouteCompletion(params: {
542
+ selectedRoute: Route<TContext, TData>;
543
+ session: SessionState<TData>;
544
+ context: TContext;
545
+ history: Event[];
546
+ }): Promise<{ session: SessionState<TData>; hasTransition: boolean }> {
547
+ const { selectedRoute, session, context, history } = params;
548
+
549
+ // Check for onComplete transition
550
+ const transitionConfig = await selectedRoute.evaluateOnComplete(
551
+ { data: session.data },
552
+ context
553
+ );
554
+
555
+ if (transitionConfig) {
556
+ // Find target route by ID or title
557
+ const targetRoute = this.routes.find(
558
+ (r) =>
559
+ r.id === transitionConfig.nextStep ||
560
+ r.title === transitionConfig.nextStep
561
+ );
562
+
563
+ if (targetRoute) {
564
+ const templateContext = {
565
+ context,
566
+ session,
567
+ history,
568
+ };
569
+ const renderedCondition: string =
570
+ (await render(transitionConfig.condition, templateContext)) ||
571
+ (typeof transitionConfig.condition === "string"
572
+ ? transitionConfig.condition
573
+ : "");
574
+
575
+ // Set pending transition in session
576
+ const updatedSession = {
577
+ ...session,
578
+ pendingTransition: {
579
+ targetRouteId: targetRoute.id,
580
+ condition: renderedCondition,
581
+ reason: "route_complete" as const,
582
+ },
583
+ };
584
+ logger.debug(
585
+ `[ResponseHandler] Route ${selectedRoute.title} completed with pending transition to: ${targetRoute.title}`
586
+ );
587
+ return { session: updatedSession, hasTransition: true };
588
+ } else {
589
+ logger.warn(
590
+ `[ResponseHandler] Route ${selectedRoute.title} completed but target route not found: ${transitionConfig.nextStep}`
591
+ );
592
+ }
593
+ }
594
+
595
+ // Set step to END_ROUTE marker
596
+ const updatedSession = enterStep(session, END_ROUTE_ID, "Route completed");
597
+ logger.debug(
598
+ `[ResponseHandler] Route ${selectedRoute.title} completed. Entered END_ROUTE step.`
599
+ );
600
+
601
+ return { session: updatedSession, hasTransition: false };
602
+ }
603
+
604
+ /**
605
+ * Find an available tool by name for the given route
606
+ */
607
+ private findAvailableTool(
608
+ toolName: string,
609
+ route?: Route<TContext, TData>
610
+ ): Tool<TContext, TData, unknown[], unknown> | undefined {
611
+ // Check route-level tools first (if route provided)
612
+ if (route) {
613
+ const routeTool = route
614
+ .getTools()
615
+ .find((tool) => tool.id === toolName || tool.name === toolName);
616
+ if (routeTool) return routeTool;
617
+ }
618
+
619
+ // Fall back to agent-level tools
620
+ return this.tools.find(
621
+ (tool) => tool.id === toolName || tool.name === toolName
622
+ );
623
+ }
624
+
625
+ /**
626
+ * Collect all available tools for the given route and step context
627
+ */
628
+ private collectAvailableTools(
629
+ route?: Route<TContext, TData>,
630
+ step?: Step<TContext, TData>
631
+ ): Array<{ id: string; description?: string; parameters?: unknown }> {
632
+ const availableTools = new Map<
633
+ string,
634
+ Tool<TContext, TData, unknown[], unknown>
635
+ >();
636
+
637
+ // Add agent-level tools
638
+ this.tools.forEach((tool) => {
639
+ availableTools.set(tool.id, tool);
640
+ });
641
+
642
+ // Add route-level tools (these take precedence)
643
+ if (route) {
644
+ route.getTools().forEach((tool) => {
645
+ availableTools.set(tool.id, tool);
646
+ });
647
+ }
648
+
649
+ // Filter by step-level allowed tools if specified
650
+ if (step?.tools) {
651
+ const allowedToolIds = new Set<string>();
652
+ const stepTools: Tool<TContext, TData, unknown[], unknown>[] = [];
653
+
654
+ for (const toolRef of step.tools) {
655
+ if (typeof toolRef === "string") {
656
+ // Reference to registered tool
657
+ allowedToolIds.add(toolRef);
658
+ } else {
659
+ // Inline tool definition
660
+ if (toolRef.id) {
661
+ allowedToolIds.add(toolRef.id);
662
+ stepTools.push(toolRef);
663
+ }
664
+ }
665
+ }
666
+
667
+ // If step specifies tools, only include those
668
+ if (allowedToolIds.size > 0) {
669
+ const filteredTools = new Map<
670
+ string,
671
+ Tool<TContext, TData, unknown[], unknown>
672
+ >();
673
+ for (const toolId of allowedToolIds) {
674
+ const tool = availableTools.get(toolId);
675
+ if (tool) {
676
+ filteredTools.set(toolId, tool);
677
+ }
678
+ }
679
+ // Add inline tools
680
+ stepTools.forEach((tool) => {
681
+ if (tool.id) {
682
+ filteredTools.set(tool.id, tool);
683
+ }
684
+ });
685
+ availableTools.clear();
686
+ filteredTools.forEach((tool, id) => availableTools.set(id, tool));
687
+ }
688
+ }
689
+
690
+ // Convert to the format expected by AI providers
691
+ return Array.from(availableTools.values()).map((tool) => ({
692
+ id: tool.id,
693
+ description: tool.description,
694
+ parameters: tool.parameters,
695
+ }));
696
+ }
697
+
698
+ /**
699
+ * Get current context (fetches from provider if configured)
700
+ */
701
+ private async getContext(): Promise<TContext | undefined> {
702
+ // If context provider is configured, use it to fetch fresh context
703
+ if (this.options.contextProvider) {
704
+ return await this.options.contextProvider();
705
+ }
706
+
707
+ // Otherwise return the stored context
708
+ return this.context;
709
+ }
710
+
711
+ // These need to be passed in or accessed differently since ResponseHandler is not part of Agent
712
+ private context?: TContext;
713
+ private currentSession?: SessionState<TData>;
714
+
715
+ // Setters for context and current session (needed for beforeRespond hook)
716
+ setContext(context: TContext | undefined): void {
717
+ this.context = context;
718
+ }
719
+
720
+ setCurrentSession(session: SessionState<TData> | undefined): void {
721
+ this.currentSession = session;
722
+ }
723
+
724
+ public getStoredContext(): TContext | undefined {
725
+ return this.context;
726
+ }
727
+
728
+ public getCurrentSession(): SessionState<TData> | undefined {
729
+ return this.currentSession;
730
+ }
731
+
732
+ /**
733
+ * Handle cross-route completion evaluation and notifications
734
+ * This method evaluates all routes for completion and can trigger completion handlers
735
+ */
736
+ async handleCrossRouteCompletion(params: {
737
+ routes: Route<TContext, TData>[];
738
+ session: SessionState<TData>;
739
+ context: TContext;
740
+ history: Event[];
741
+ }): Promise<{
742
+ session: SessionState<TData>;
743
+ completedRoutes: Route<TContext, TData>[];
744
+ pendingTransitions: Array<{
745
+ route: Route<TContext, TData>;
746
+ transitionConfig: RouteTransitionConfig<TContext, TData>;
747
+ }>;
748
+ }> {
749
+ const { routes, session, context } = params;
750
+
751
+ // Evaluate all routes for completion
752
+ const completedRoutes: Route<TContext, TData>[] = [];
753
+ const pendingTransitions: Array<{
754
+ route: Route<TContext, TData>;
755
+ transitionConfig: RouteTransitionConfig<TContext, TData>;
756
+ }> = [];
757
+
758
+ for (const route of routes) {
759
+ if (route.isComplete(session.data || {})) {
760
+ completedRoutes.push(route);
761
+
762
+ // Check for onComplete transitions
763
+ const transitionConfig = await route.evaluateOnComplete(
764
+ { data: session.data },
765
+ context
766
+ );
767
+
768
+ if (transitionConfig) {
769
+ pendingTransitions.push({ route, transitionConfig });
770
+ }
771
+
772
+ logger.debug(
773
+ `[ResponsePipeline] Route completed: ${route.title} ` +
774
+ `(${Math.round(route.getCompletionProgress(session.data || {}) * 100)}%)`
775
+ );
776
+ }
777
+ }
778
+
779
+ // Log completion status for all routes
780
+ if (completedRoutes.length > 0) {
781
+ logger.debug(
782
+ `[ResponsePipeline] Cross-route completion evaluation: ` +
783
+ `${completedRoutes.length}/${routes.length} routes complete`
784
+ );
785
+ }
786
+
787
+ return {
788
+ session,
789
+ completedRoutes,
790
+ pendingTransitions,
791
+ };
792
+ }
793
+
794
+ /**
795
+ * Update data flow to ensure agent-level data consistency
796
+ * This method ensures that data updates are properly validated and propagated
797
+ */
798
+ async updateDataFlow(params: {
799
+ session: SessionState<TData>;
800
+ dataUpdate: Partial<TData>;
801
+ routes: Route<TContext, TData>[];
802
+ }): Promise<SessionState<TData>> {
803
+ const { session, dataUpdate, routes } = params;
804
+
805
+ // Update session data
806
+ const updatedSession = await this.updateData(session, dataUpdate);
807
+
808
+ // Update agent-level data if handler is available
809
+ if (this.updateCollectedData) {
810
+ await this.updateCollectedData(dataUpdate);
811
+ }
812
+
813
+ // Evaluate route completions after data update
814
+ const completionResults = await this.handleCrossRouteCompletion({
815
+ routes,
816
+ session: updatedSession,
817
+ context: this.context!,
818
+ history: [],
819
+ });
820
+
821
+ // Log any newly completed routes
822
+ if (completionResults.completedRoutes.length > 0) {
823
+ logger.debug(
824
+ `[ResponsePipeline] Data update resulted in ${completionResults.completedRoutes.length} completed routes`
825
+ );
826
+ }
827
+
828
+ return completionResults.session;
829
+ }
830
+ }