@falai/agent 0.8.1 → 0.9.0-alpha-1

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