@falai/agent 0.8.0 → 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 (654) 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 +67 -69
  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/cjs/src/core/PersistenceManager.d.ts +98 -0
  43. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  44. package/dist/cjs/{core → src/core}/PersistenceManager.js +62 -32
  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 +54 -35
  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 +36 -13
  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 +67 -69
  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/src/core/PersistenceManager.d.ts +98 -0
  204. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  205. package/dist/{core → src/core}/PersistenceManager.js +56 -26
  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 +54 -35
  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 +34 -13
  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} +902 -263
  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} +144 -95
  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} +2 -2
  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} +115 -108
  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 +1102 -487
  369. package/src/core/Events.ts +100 -112
  370. package/src/core/PersistenceManager.ts +87 -57
  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 +50 -38
  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 +0 -96
  443. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  444. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  445. package/dist/cjs/core/PromptComposer.d.ts +0 -24
  446. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  447. package/dist/cjs/core/PromptComposer.js +0 -127
  448. package/dist/cjs/core/PromptComposer.js.map +0 -1
  449. package/dist/cjs/core/ResponseEngine.d.ts +0 -14
  450. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  451. package/dist/cjs/core/ResponseEngine.js +0 -56
  452. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  453. package/dist/cjs/core/Route.d.ts +0 -90
  454. package/dist/cjs/core/Route.d.ts.map +0 -1
  455. package/dist/cjs/core/Route.js.map +0 -1
  456. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  457. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  458. package/dist/cjs/core/Step.d.ts +0 -72
  459. package/dist/cjs/core/Step.d.ts.map +0 -1
  460. package/dist/cjs/core/Step.js +0 -150
  461. package/dist/cjs/core/Step.js.map +0 -1
  462. package/dist/cjs/core/Tool.d.ts +0 -39
  463. package/dist/cjs/core/Tool.d.ts.map +0 -1
  464. package/dist/cjs/core/Tool.js +0 -34
  465. package/dist/cjs/core/Tool.js.map +0 -1
  466. package/dist/cjs/core/ToolExecutor.d.ts +0 -29
  467. package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
  468. package/dist/cjs/core/ToolExecutor.js.map +0 -1
  469. package/dist/cjs/core/Transition.d.ts +0 -32
  470. package/dist/cjs/core/Transition.d.ts.map +0 -1
  471. package/dist/cjs/core/Transition.js +0 -89
  472. package/dist/cjs/core/Transition.js.map +0 -1
  473. package/dist/cjs/index.d.ts.map +0 -1
  474. package/dist/cjs/index.js.map +0 -1
  475. package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
  476. package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
  477. package/dist/cjs/providers/GeminiProvider.js.map +0 -1
  478. package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
  479. package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
  480. package/dist/cjs/providers/index.js.map +0 -1
  481. package/dist/cjs/types/agent.d.ts.map +0 -1
  482. package/dist/cjs/types/agent.js.map +0 -1
  483. package/dist/cjs/types/ai.d.ts.map +0 -1
  484. package/dist/cjs/types/history.d.ts.map +0 -1
  485. package/dist/cjs/types/history.js +0 -37
  486. package/dist/cjs/types/history.js.map +0 -1
  487. package/dist/cjs/types/index.d.ts +0 -12
  488. package/dist/cjs/types/index.d.ts.map +0 -1
  489. package/dist/cjs/types/index.js +0 -12
  490. package/dist/cjs/types/index.js.map +0 -1
  491. package/dist/cjs/types/persistence.d.ts.map +0 -1
  492. package/dist/cjs/types/persistence.js.map +0 -1
  493. package/dist/cjs/types/route.d.ts.map +0 -1
  494. package/dist/cjs/types/session.d.ts +0 -104
  495. package/dist/cjs/types/session.d.ts.map +0 -1
  496. package/dist/cjs/types/session.js.map +0 -1
  497. package/dist/cjs/utils/event.js.map +0 -1
  498. package/dist/cjs/utils/id.js.map +0 -1
  499. package/dist/cjs/utils/logger.js.map +0 -1
  500. package/dist/cjs/utils/retry.js.map +0 -1
  501. package/dist/constants/index.d.ts.map +0 -1
  502. package/dist/constants/index.js.map +0 -1
  503. package/dist/core/Agent.d.ts.map +0 -1
  504. package/dist/core/Agent.js +0 -962
  505. package/dist/core/Agent.js.map +0 -1
  506. package/dist/core/DomainRegistry.d.ts +0 -36
  507. package/dist/core/DomainRegistry.d.ts.map +0 -1
  508. package/dist/core/DomainRegistry.js +0 -68
  509. package/dist/core/DomainRegistry.js.map +0 -1
  510. package/dist/core/Events.d.ts +0 -41
  511. package/dist/core/Events.d.ts.map +0 -1
  512. package/dist/core/Events.js +0 -94
  513. package/dist/core/Events.js.map +0 -1
  514. package/dist/core/PersistenceManager.d.ts +0 -96
  515. package/dist/core/PersistenceManager.d.ts.map +0 -1
  516. package/dist/core/PersistenceManager.js.map +0 -1
  517. package/dist/core/PromptComposer.d.ts +0 -24
  518. package/dist/core/PromptComposer.d.ts.map +0 -1
  519. package/dist/core/PromptComposer.js +0 -123
  520. package/dist/core/PromptComposer.js.map +0 -1
  521. package/dist/core/ResponseEngine.d.ts +0 -14
  522. package/dist/core/ResponseEngine.d.ts.map +0 -1
  523. package/dist/core/ResponseEngine.js +0 -52
  524. package/dist/core/ResponseEngine.js.map +0 -1
  525. package/dist/core/Route.d.ts +0 -90
  526. package/dist/core/Route.d.ts.map +0 -1
  527. package/dist/core/Route.js.map +0 -1
  528. package/dist/core/RoutingEngine.d.ts.map +0 -1
  529. package/dist/core/RoutingEngine.js.map +0 -1
  530. package/dist/core/Step.d.ts +0 -72
  531. package/dist/core/Step.d.ts.map +0 -1
  532. package/dist/core/Step.js +0 -146
  533. package/dist/core/Step.js.map +0 -1
  534. package/dist/core/Tool.d.ts +0 -39
  535. package/dist/core/Tool.d.ts.map +0 -1
  536. package/dist/core/Tool.js +0 -31
  537. package/dist/core/Tool.js.map +0 -1
  538. package/dist/core/ToolExecutor.d.ts +0 -29
  539. package/dist/core/ToolExecutor.d.ts.map +0 -1
  540. package/dist/core/ToolExecutor.js +0 -69
  541. package/dist/core/ToolExecutor.js.map +0 -1
  542. package/dist/core/Transition.d.ts +0 -32
  543. package/dist/core/Transition.d.ts.map +0 -1
  544. package/dist/core/Transition.js +0 -85
  545. package/dist/core/Transition.js.map +0 -1
  546. package/dist/index.d.ts.map +0 -1
  547. package/dist/index.js.map +0 -1
  548. package/dist/providers/AnthropicProvider.d.ts.map +0 -1
  549. package/dist/providers/AnthropicProvider.js.map +0 -1
  550. package/dist/providers/GeminiProvider.d.ts.map +0 -1
  551. package/dist/providers/GeminiProvider.js.map +0 -1
  552. package/dist/providers/OpenAIProvider.d.ts.map +0 -1
  553. package/dist/providers/OpenAIProvider.js.map +0 -1
  554. package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
  555. package/dist/providers/OpenRouterProvider.js.map +0 -1
  556. package/dist/providers/index.d.ts.map +0 -1
  557. package/dist/providers/index.js.map +0 -1
  558. package/dist/types/agent.d.ts.map +0 -1
  559. package/dist/types/agent.js.map +0 -1
  560. package/dist/types/ai.d.ts.map +0 -1
  561. package/dist/types/ai.js.map +0 -1
  562. package/dist/types/history.d.ts.map +0 -1
  563. package/dist/types/history.js +0 -34
  564. package/dist/types/history.js.map +0 -1
  565. package/dist/types/index.d.ts +0 -12
  566. package/dist/types/index.d.ts.map +0 -1
  567. package/dist/types/index.js +0 -6
  568. package/dist/types/index.js.map +0 -1
  569. package/dist/types/persistence.d.ts.map +0 -1
  570. package/dist/types/persistence.js.map +0 -1
  571. package/dist/types/route.d.ts.map +0 -1
  572. package/dist/types/routing.d.ts.map +0 -1
  573. package/dist/types/schema.d.ts.map +0 -1
  574. package/dist/types/session.d.ts +0 -104
  575. package/dist/types/session.d.ts.map +0 -1
  576. package/dist/types/session.js.map +0 -1
  577. package/dist/types/tool.d.ts.map +0 -1
  578. package/dist/utils/event.d.ts.map +0 -1
  579. package/dist/utils/event.js.map +0 -1
  580. package/dist/utils/id.d.ts.map +0 -1
  581. package/dist/utils/id.js.map +0 -1
  582. package/dist/utils/logger.d.ts.map +0 -1
  583. package/dist/utils/logger.js.map +0 -1
  584. package/dist/utils/retry.d.ts.map +0 -1
  585. package/dist/utils/retry.js.map +0 -1
  586. package/docs/AGENT.md +0 -535
  587. package/docs/DOCS.md +0 -263
  588. package/docs/DOMAINS.md +0 -735
  589. package/docs/EXAMPLES.md +0 -467
  590. package/docs/GETTING_STARTED.md +0 -424
  591. package/docs/PERSISTENCE.md +0 -815
  592. package/docs/PROVIDERS.md +0 -612
  593. package/docs/ROUTES.md +0 -1085
  594. package/docs/STEPS.md +0 -883
  595. package/examples/business-onboarding.ts +0 -791
  596. package/examples/custom-database-persistence.ts +0 -574
  597. package/examples/domain-scoping.ts +0 -366
  598. package/examples/travel-agent.ts +0 -584
  599. package/src/core/DomainRegistry.ts +0 -80
  600. package/src/core/Tool.ts +0 -112
  601. package/src/core/Transition.ts +0 -115
  602. /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
  603. /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
  604. /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
  605. /package/dist/cjs/{constants → src/constants}/index.js +0 -0
  606. /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
  607. /package/dist/cjs/{providers → src/providers}/index.js +0 -0
  608. /package/dist/cjs/{types → src/types}/agent.js +0 -0
  609. /package/dist/cjs/{types → src/types}/ai.js +0 -0
  610. /package/dist/cjs/{types → src/types}/persistence.js +0 -0
  611. /package/dist/cjs/{types → src/types}/route.js +0 -0
  612. /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
  613. /package/dist/cjs/{types → src/types}/routing.js +0 -0
  614. /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
  615. /package/dist/cjs/{types → src/types}/schema.js +0 -0
  616. /package/dist/cjs/{types → src/types}/tool.js +0 -0
  617. /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
  618. /package/dist/cjs/{utils → src/utils}/id.js +0 -0
  619. /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
  620. /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
  621. /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
  622. /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
  623. /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
  624. /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
  625. /package/dist/{adapters → src/adapters}/index.js +0 -0
  626. /package/dist/{constants → src/constants}/index.d.ts +0 -0
  627. /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
  628. /package/dist/{constants → src/constants}/index.js +0 -0
  629. /package/dist/{providers → src/providers}/index.d.ts +0 -0
  630. /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
  631. /package/dist/{providers → src/providers}/index.js +0 -0
  632. /package/dist/{types → src/types}/agent.js +0 -0
  633. /package/dist/{types → src/types}/ai.js +0 -0
  634. /package/dist/{types → src/types}/persistence.js +0 -0
  635. /package/dist/{types → src/types}/route.js +0 -0
  636. /package/dist/{types → src/types}/routing.d.ts +0 -0
  637. /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
  638. /package/dist/{types → src/types}/routing.js +0 -0
  639. /package/dist/{cjs → src}/types/routing.js.map +0 -0
  640. /package/dist/{types → src/types}/schema.d.ts +0 -0
  641. /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
  642. /package/dist/{types → src/types}/schema.js +0 -0
  643. /package/dist/{cjs → src}/types/schema.js.map +0 -0
  644. /package/dist/{types → src/types}/tool.js +0 -0
  645. /package/dist/{utils → src/utils}/id.d.ts +0 -0
  646. /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
  647. /package/dist/{utils → src/utils}/id.js +0 -0
  648. /package/dist/{utils → src/utils}/logger.d.ts +0 -0
  649. /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
  650. /package/dist/{utils → src/utils}/logger.js +0 -0
  651. /package/dist/{utils → src/utils}/retry.d.ts +0 -0
  652. /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
  653. /package/dist/{utils → src/utils}/retry.js +0 -0
  654. /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
+ }