@falai/agent 0.1.0-alpha2

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