@falai/agent 0.1.0-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/README.md +797 -0
  2. package/dist/cjs/package.json +1 -0
  3. package/dist/cjs/src/adapters/MemoryAdapter.d.ts +47 -0
  4. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
  5. package/dist/cjs/src/adapters/MemoryAdapter.js +202 -0
  6. package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
  7. package/dist/cjs/src/adapters/MongoAdapter.d.ts +97 -0
  8. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
  9. package/dist/cjs/src/adapters/MongoAdapter.js +168 -0
  10. package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
  11. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts +169 -0
  12. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  13. package/dist/cjs/src/adapters/OpenSearchAdapter.js +458 -0
  14. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
  15. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts +71 -0
  16. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  17. package/dist/cjs/src/adapters/PostgreSQLAdapter.js +260 -0
  18. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
  19. package/dist/cjs/src/adapters/PrismaAdapter.d.ts +115 -0
  20. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
  21. package/dist/cjs/src/adapters/PrismaAdapter.js +366 -0
  22. package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
  23. package/dist/cjs/src/adapters/RedisAdapter.d.ts +71 -0
  24. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
  25. package/dist/cjs/src/adapters/RedisAdapter.js +231 -0
  26. package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
  27. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts +69 -0
  28. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  29. package/dist/cjs/src/adapters/SQLiteAdapter.js +312 -0
  30. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
  31. package/dist/cjs/src/adapters/index.d.ts +17 -0
  32. package/dist/cjs/src/adapters/index.d.ts.map +1 -0
  33. package/dist/cjs/src/adapters/index.js +21 -0
  34. package/dist/cjs/src/adapters/index.js.map +1 -0
  35. package/dist/cjs/src/constants/index.d.ts +10 -0
  36. package/dist/cjs/src/constants/index.d.ts.map +1 -0
  37. package/dist/cjs/src/constants/index.js +13 -0
  38. package/dist/cjs/src/constants/index.js.map +1 -0
  39. package/dist/cjs/src/core/Agent.d.ts +232 -0
  40. package/dist/cjs/src/core/Agent.d.ts.map +1 -0
  41. package/dist/cjs/src/core/Agent.js +741 -0
  42. package/dist/cjs/src/core/Agent.js.map +1 -0
  43. package/dist/cjs/src/core/Events.d.ts +26 -0
  44. package/dist/cjs/src/core/Events.d.ts.map +1 -0
  45. package/dist/cjs/src/core/Events.js +144 -0
  46. package/dist/cjs/src/core/Events.js.map +1 -0
  47. package/dist/cjs/src/core/PersistenceManager.d.ts +98 -0
  48. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  49. package/dist/cjs/src/core/PersistenceManager.js +261 -0
  50. package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
  51. package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
  52. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
  53. package/dist/cjs/src/core/PromptComposer.js +194 -0
  54. package/dist/cjs/src/core/PromptComposer.js.map +1 -0
  55. package/dist/cjs/src/core/ResponseEngine.d.ts +32 -0
  56. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
  57. package/dist/cjs/src/core/ResponseEngine.js +202 -0
  58. package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
  59. package/dist/cjs/src/core/ResponseModal.d.ts +222 -0
  60. package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
  61. package/dist/cjs/src/core/ResponseModal.js +1588 -0
  62. package/dist/cjs/src/core/ResponseModal.js.map +1 -0
  63. package/dist/cjs/src/core/ResponsePipeline.d.ts +175 -0
  64. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
  65. package/dist/cjs/src/core/ResponsePipeline.js +549 -0
  66. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
  67. package/dist/cjs/src/core/Route.d.ts +181 -0
  68. package/dist/cjs/src/core/Route.d.ts.map +1 -0
  69. package/dist/cjs/src/core/Route.js +541 -0
  70. package/dist/cjs/src/core/Route.js.map +1 -0
  71. package/dist/cjs/src/core/RoutingEngine.d.ts +159 -0
  72. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
  73. package/dist/cjs/src/core/RoutingEngine.js +961 -0
  74. package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
  75. package/dist/cjs/src/core/SessionManager.d.ts +94 -0
  76. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
  77. package/dist/cjs/src/core/SessionManager.js +239 -0
  78. package/dist/cjs/src/core/SessionManager.js.map +1 -0
  79. package/dist/cjs/src/core/Step.d.ts +170 -0
  80. package/dist/cjs/src/core/Step.d.ts.map +1 -0
  81. package/dist/cjs/src/core/Step.js +448 -0
  82. package/dist/cjs/src/core/Step.js.map +1 -0
  83. package/dist/cjs/src/core/ToolManager.d.ts +234 -0
  84. package/dist/cjs/src/core/ToolManager.d.ts.map +1 -0
  85. package/dist/cjs/src/core/ToolManager.js +1117 -0
  86. package/dist/cjs/src/core/ToolManager.js.map +1 -0
  87. package/dist/cjs/src/index.d.ts +44 -0
  88. package/dist/cjs/src/index.d.ts.map +1 -0
  89. package/dist/cjs/src/index.js +88 -0
  90. package/dist/cjs/src/index.js.map +1 -0
  91. package/dist/cjs/src/providers/AnthropicProvider.d.ts +43 -0
  92. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
  93. package/dist/cjs/src/providers/AnthropicProvider.js +377 -0
  94. package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
  95. package/dist/cjs/src/providers/GeminiProvider.d.ts +58 -0
  96. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
  97. package/dist/cjs/src/providers/GeminiProvider.js +489 -0
  98. package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
  99. package/dist/cjs/src/providers/OpenAIProvider.d.ts +52 -0
  100. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
  101. package/dist/cjs/src/providers/OpenAIProvider.js +395 -0
  102. package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
  103. package/dist/cjs/src/providers/OpenRouterProvider.d.ts +56 -0
  104. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
  105. package/dist/cjs/src/providers/OpenRouterProvider.js +409 -0
  106. package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
  107. package/dist/cjs/src/providers/index.d.ts +13 -0
  108. package/dist/cjs/src/providers/index.d.ts.map +1 -0
  109. package/dist/cjs/src/providers/index.js +16 -0
  110. package/dist/cjs/src/providers/index.js.map +1 -0
  111. package/dist/cjs/src/types/agent.d.ts +181 -0
  112. package/dist/cjs/src/types/agent.d.ts.map +1 -0
  113. package/dist/cjs/src/types/agent.js +21 -0
  114. package/dist/cjs/src/types/agent.js.map +1 -0
  115. package/dist/cjs/src/types/ai.d.ts +143 -0
  116. package/dist/cjs/src/types/ai.d.ts.map +1 -0
  117. package/dist/cjs/src/types/ai.js +6 -0
  118. package/dist/cjs/src/types/ai.js.map +1 -0
  119. package/dist/cjs/src/types/history.d.ts +178 -0
  120. package/dist/cjs/src/types/history.d.ts.map +1 -0
  121. package/dist/cjs/src/types/history.js +33 -0
  122. package/dist/cjs/src/types/history.js.map +1 -0
  123. package/dist/cjs/src/types/index.d.ts +22 -0
  124. package/dist/cjs/src/types/index.d.ts.map +1 -0
  125. package/dist/cjs/src/types/index.js +37 -0
  126. package/dist/cjs/src/types/index.js.map +1 -0
  127. package/dist/cjs/src/types/persistence.d.ts +209 -0
  128. package/dist/cjs/src/types/persistence.d.ts.map +1 -0
  129. package/dist/cjs/src/types/persistence.js +7 -0
  130. package/dist/cjs/src/types/persistence.js.map +1 -0
  131. package/dist/cjs/src/types/route.d.ts +238 -0
  132. package/dist/cjs/src/types/route.d.ts.map +1 -0
  133. package/dist/cjs/src/types/route.js +6 -0
  134. package/dist/cjs/src/types/route.js.map +1 -0
  135. package/dist/cjs/src/types/routing.d.ts +16 -0
  136. package/dist/cjs/src/types/routing.d.ts.map +1 -0
  137. package/dist/cjs/src/types/routing.js +3 -0
  138. package/dist/cjs/src/types/routing.js.map +1 -0
  139. package/dist/cjs/src/types/schema.d.ts +22 -0
  140. package/dist/cjs/src/types/schema.d.ts.map +1 -0
  141. package/dist/cjs/src/types/schema.js +3 -0
  142. package/dist/cjs/src/types/schema.js.map +1 -0
  143. package/dist/cjs/src/types/session.d.ts +65 -0
  144. package/dist/cjs/src/types/session.d.ts.map +1 -0
  145. package/dist/cjs/src/types/session.js +6 -0
  146. package/dist/cjs/src/types/session.js.map +1 -0
  147. package/dist/cjs/src/types/template.d.ts +88 -0
  148. package/dist/cjs/src/types/template.d.ts.map +1 -0
  149. package/dist/cjs/src/types/template.js +3 -0
  150. package/dist/cjs/src/types/template.js.map +1 -0
  151. package/dist/cjs/src/types/tool.d.ts +130 -0
  152. package/dist/cjs/src/types/tool.d.ts.map +1 -0
  153. package/dist/cjs/src/types/tool.js +19 -0
  154. package/dist/cjs/src/types/tool.js.map +1 -0
  155. package/dist/cjs/src/utils/clone.d.ts +8 -0
  156. package/dist/cjs/src/utils/clone.d.ts.map +1 -0
  157. package/dist/cjs/src/utils/clone.js +32 -0
  158. package/dist/cjs/src/utils/clone.js.map +1 -0
  159. package/dist/cjs/src/utils/condition.d.ts +38 -0
  160. package/dist/cjs/src/utils/condition.d.ts.map +1 -0
  161. package/dist/cjs/src/utils/condition.js +168 -0
  162. package/dist/cjs/src/utils/condition.js.map +1 -0
  163. package/dist/cjs/src/utils/event.d.ts +6 -0
  164. package/dist/cjs/src/utils/event.d.ts.map +1 -0
  165. package/dist/cjs/src/utils/event.js +20 -0
  166. package/dist/cjs/src/utils/event.js.map +1 -0
  167. package/dist/cjs/src/utils/history.d.ts +60 -0
  168. package/dist/cjs/src/utils/history.d.ts.map +1 -0
  169. package/dist/cjs/src/utils/history.js +274 -0
  170. package/dist/cjs/src/utils/history.js.map +1 -0
  171. package/dist/cjs/src/utils/id.d.ts +25 -0
  172. package/dist/cjs/src/utils/id.d.ts.map +1 -0
  173. package/dist/cjs/src/utils/id.js +70 -0
  174. package/dist/cjs/src/utils/id.js.map +1 -0
  175. package/dist/cjs/src/utils/index.d.ts +15 -0
  176. package/dist/cjs/src/utils/index.d.ts.map +1 -0
  177. package/dist/cjs/src/utils/index.js +64 -0
  178. package/dist/cjs/src/utils/index.js.map +1 -0
  179. package/dist/cjs/src/utils/json.d.ts +16 -0
  180. package/dist/cjs/src/utils/json.d.ts.map +1 -0
  181. package/dist/cjs/src/utils/json.js +47 -0
  182. package/dist/cjs/src/utils/json.js.map +1 -0
  183. package/dist/cjs/src/utils/logger.d.ts +10 -0
  184. package/dist/cjs/src/utils/logger.d.ts.map +1 -0
  185. package/dist/cjs/src/utils/logger.js +23 -0
  186. package/dist/cjs/src/utils/logger.js.map +1 -0
  187. package/dist/cjs/src/utils/retry.d.ts +10 -0
  188. package/dist/cjs/src/utils/retry.d.ts.map +1 -0
  189. package/dist/cjs/src/utils/retry.js +76 -0
  190. package/dist/cjs/src/utils/retry.js.map +1 -0
  191. package/dist/cjs/src/utils/session.d.ts +51 -0
  192. package/dist/cjs/src/utils/session.d.ts.map +1 -0
  193. package/dist/cjs/src/utils/session.js +170 -0
  194. package/dist/cjs/src/utils/session.js.map +1 -0
  195. package/dist/cjs/src/utils/template.d.ts +155 -0
  196. package/dist/cjs/src/utils/template.d.ts.map +1 -0
  197. package/dist/cjs/src/utils/template.js +383 -0
  198. package/dist/cjs/src/utils/template.js.map +1 -0
  199. package/dist/src/adapters/MemoryAdapter.d.ts +47 -0
  200. package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
  201. package/dist/src/adapters/MemoryAdapter.js +198 -0
  202. package/dist/src/adapters/MemoryAdapter.js.map +1 -0
  203. package/dist/src/adapters/MongoAdapter.d.ts +97 -0
  204. package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
  205. package/dist/src/adapters/MongoAdapter.js +164 -0
  206. package/dist/src/adapters/MongoAdapter.js.map +1 -0
  207. package/dist/src/adapters/OpenSearchAdapter.d.ts +169 -0
  208. package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  209. package/dist/src/adapters/OpenSearchAdapter.js +454 -0
  210. package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
  211. package/dist/src/adapters/PostgreSQLAdapter.d.ts +71 -0
  212. package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  213. package/dist/src/adapters/PostgreSQLAdapter.js +256 -0
  214. package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
  215. package/dist/src/adapters/PrismaAdapter.d.ts +115 -0
  216. package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
  217. package/dist/src/adapters/PrismaAdapter.js +362 -0
  218. package/dist/src/adapters/PrismaAdapter.js.map +1 -0
  219. package/dist/src/adapters/RedisAdapter.d.ts +71 -0
  220. package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
  221. package/dist/src/adapters/RedisAdapter.js +227 -0
  222. package/dist/src/adapters/RedisAdapter.js.map +1 -0
  223. package/dist/src/adapters/SQLiteAdapter.d.ts +69 -0
  224. package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  225. package/dist/src/adapters/SQLiteAdapter.js +308 -0
  226. package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
  227. package/dist/src/adapters/index.d.ts +17 -0
  228. package/dist/src/adapters/index.d.ts.map +1 -0
  229. package/dist/src/adapters/index.js +11 -0
  230. package/dist/src/adapters/index.js.map +1 -0
  231. package/dist/src/constants/index.d.ts +10 -0
  232. package/dist/src/constants/index.d.ts.map +1 -0
  233. package/dist/src/constants/index.js +10 -0
  234. package/dist/src/constants/index.js.map +1 -0
  235. package/dist/src/core/Agent.d.ts +232 -0
  236. package/dist/src/core/Agent.d.ts.map +1 -0
  237. package/dist/src/core/Agent.js +737 -0
  238. package/dist/src/core/Agent.js.map +1 -0
  239. package/dist/src/core/Events.d.ts +26 -0
  240. package/dist/src/core/Events.d.ts.map +1 -0
  241. package/dist/src/core/Events.js +137 -0
  242. package/dist/src/core/Events.js.map +1 -0
  243. package/dist/src/core/PersistenceManager.d.ts +98 -0
  244. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  245. package/dist/src/core/PersistenceManager.js +257 -0
  246. package/dist/src/core/PersistenceManager.js.map +1 -0
  247. package/dist/src/core/PromptComposer.d.ts +27 -0
  248. package/dist/src/core/PromptComposer.d.ts.map +1 -0
  249. package/dist/src/core/PromptComposer.js +190 -0
  250. package/dist/src/core/PromptComposer.js.map +1 -0
  251. package/dist/src/core/ResponseEngine.d.ts +32 -0
  252. package/dist/src/core/ResponseEngine.d.ts.map +1 -0
  253. package/dist/src/core/ResponseEngine.js +198 -0
  254. package/dist/src/core/ResponseEngine.js.map +1 -0
  255. package/dist/src/core/ResponseModal.d.ts +222 -0
  256. package/dist/src/core/ResponseModal.d.ts.map +1 -0
  257. package/dist/src/core/ResponseModal.js +1583 -0
  258. package/dist/src/core/ResponseModal.js.map +1 -0
  259. package/dist/src/core/ResponsePipeline.d.ts +175 -0
  260. package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
  261. package/dist/src/core/ResponsePipeline.js +545 -0
  262. package/dist/src/core/ResponsePipeline.js.map +1 -0
  263. package/dist/src/core/Route.d.ts +181 -0
  264. package/dist/src/core/Route.d.ts.map +1 -0
  265. package/dist/src/core/Route.js +537 -0
  266. package/dist/src/core/Route.js.map +1 -0
  267. package/dist/src/core/RoutingEngine.d.ts +159 -0
  268. package/dist/src/core/RoutingEngine.d.ts.map +1 -0
  269. package/dist/src/core/RoutingEngine.js +957 -0
  270. package/dist/src/core/RoutingEngine.js.map +1 -0
  271. package/dist/src/core/SessionManager.d.ts +94 -0
  272. package/dist/src/core/SessionManager.d.ts.map +1 -0
  273. package/dist/src/core/SessionManager.js +235 -0
  274. package/dist/src/core/SessionManager.js.map +1 -0
  275. package/dist/src/core/Step.d.ts +170 -0
  276. package/dist/src/core/Step.d.ts.map +1 -0
  277. package/dist/src/core/Step.js +444 -0
  278. package/dist/src/core/Step.js.map +1 -0
  279. package/dist/src/core/ToolManager.d.ts +234 -0
  280. package/dist/src/core/ToolManager.d.ts.map +1 -0
  281. package/dist/src/core/ToolManager.js +1111 -0
  282. package/dist/src/core/ToolManager.js.map +1 -0
  283. package/dist/src/index.d.ts +44 -0
  284. package/dist/src/index.d.ts.map +1 -0
  285. package/dist/src/index.js +37 -0
  286. package/dist/src/index.js.map +1 -0
  287. package/dist/src/providers/AnthropicProvider.d.ts +43 -0
  288. package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
  289. package/dist/src/providers/AnthropicProvider.js +370 -0
  290. package/dist/src/providers/AnthropicProvider.js.map +1 -0
  291. package/dist/src/providers/GeminiProvider.d.ts +58 -0
  292. package/dist/src/providers/GeminiProvider.d.ts.map +1 -0
  293. package/dist/src/providers/GeminiProvider.js +485 -0
  294. package/dist/src/providers/GeminiProvider.js.map +1 -0
  295. package/dist/src/providers/OpenAIProvider.d.ts +52 -0
  296. package/dist/src/providers/OpenAIProvider.d.ts.map +1 -0
  297. package/dist/src/providers/OpenAIProvider.js +388 -0
  298. package/dist/src/providers/OpenAIProvider.js.map +1 -0
  299. package/dist/src/providers/OpenRouterProvider.d.ts +56 -0
  300. package/dist/src/providers/OpenRouterProvider.d.ts.map +1 -0
  301. package/dist/src/providers/OpenRouterProvider.js +402 -0
  302. package/dist/src/providers/OpenRouterProvider.js.map +1 -0
  303. package/dist/src/providers/index.d.ts +13 -0
  304. package/dist/src/providers/index.d.ts.map +1 -0
  305. package/dist/src/providers/index.js +9 -0
  306. package/dist/src/providers/index.js.map +1 -0
  307. package/dist/src/types/agent.d.ts +181 -0
  308. package/dist/src/types/agent.d.ts.map +1 -0
  309. package/dist/src/types/agent.js +18 -0
  310. package/dist/src/types/agent.js.map +1 -0
  311. package/dist/src/types/ai.d.ts +143 -0
  312. package/dist/src/types/ai.d.ts.map +1 -0
  313. package/dist/src/types/ai.js +5 -0
  314. package/dist/src/types/ai.js.map +1 -0
  315. package/dist/src/types/history.d.ts +178 -0
  316. package/dist/src/types/history.d.ts.map +1 -0
  317. package/dist/src/types/history.js +30 -0
  318. package/dist/src/types/history.js.map +1 -0
  319. package/dist/src/types/index.d.ts +22 -0
  320. package/dist/src/types/index.d.ts.map +1 -0
  321. package/dist/src/types/index.js +12 -0
  322. package/dist/src/types/index.js.map +1 -0
  323. package/dist/src/types/persistence.d.ts +209 -0
  324. package/dist/src/types/persistence.d.ts.map +1 -0
  325. package/dist/src/types/persistence.js +6 -0
  326. package/dist/src/types/persistence.js.map +1 -0
  327. package/dist/src/types/route.d.ts +238 -0
  328. package/dist/src/types/route.d.ts.map +1 -0
  329. package/dist/src/types/route.js +5 -0
  330. package/dist/src/types/route.js.map +1 -0
  331. package/dist/src/types/routing.d.ts +16 -0
  332. package/dist/src/types/routing.d.ts.map +1 -0
  333. package/dist/src/types/routing.js +2 -0
  334. package/dist/src/types/routing.js.map +1 -0
  335. package/dist/src/types/schema.d.ts +22 -0
  336. package/dist/src/types/schema.d.ts.map +1 -0
  337. package/dist/src/types/schema.js +2 -0
  338. package/dist/src/types/schema.js.map +1 -0
  339. package/dist/src/types/session.d.ts +65 -0
  340. package/dist/src/types/session.d.ts.map +1 -0
  341. package/dist/src/types/session.js +5 -0
  342. package/dist/src/types/session.js.map +1 -0
  343. package/dist/src/types/template.d.ts +88 -0
  344. package/dist/src/types/template.d.ts.map +1 -0
  345. package/dist/src/types/template.js +2 -0
  346. package/dist/src/types/template.js.map +1 -0
  347. package/dist/src/types/tool.d.ts +130 -0
  348. package/dist/src/types/tool.d.ts.map +1 -0
  349. package/dist/src/types/tool.js +16 -0
  350. package/dist/src/types/tool.js.map +1 -0
  351. package/dist/src/utils/clone.d.ts +8 -0
  352. package/dist/src/utils/clone.d.ts.map +1 -0
  353. package/dist/src/utils/clone.js +29 -0
  354. package/dist/src/utils/clone.js.map +1 -0
  355. package/dist/src/utils/condition.d.ts +38 -0
  356. package/dist/src/utils/condition.d.ts.map +1 -0
  357. package/dist/src/utils/condition.js +161 -0
  358. package/dist/src/utils/condition.js.map +1 -0
  359. package/dist/src/utils/event.d.ts +6 -0
  360. package/dist/src/utils/event.d.ts.map +1 -0
  361. package/dist/src/utils/event.js +17 -0
  362. package/dist/src/utils/event.js.map +1 -0
  363. package/dist/src/utils/history.d.ts +60 -0
  364. package/dist/src/utils/history.d.ts.map +1 -0
  365. package/dist/src/utils/history.js +263 -0
  366. package/dist/src/utils/history.js.map +1 -0
  367. package/dist/src/utils/id.d.ts +25 -0
  368. package/dist/src/utils/id.d.ts.map +1 -0
  369. package/dist/src/utils/id.js +64 -0
  370. package/dist/src/utils/id.js.map +1 -0
  371. package/dist/src/utils/index.d.ts +15 -0
  372. package/dist/src/utils/index.d.ts.map +1 -0
  373. package/dist/src/utils/index.js +23 -0
  374. package/dist/src/utils/index.js.map +1 -0
  375. package/dist/src/utils/json.d.ts +16 -0
  376. package/dist/src/utils/json.d.ts.map +1 -0
  377. package/dist/src/utils/json.js +43 -0
  378. package/dist/src/utils/json.js.map +1 -0
  379. package/dist/src/utils/logger.d.ts +10 -0
  380. package/dist/src/utils/logger.d.ts.map +1 -0
  381. package/dist/src/utils/logger.js +17 -0
  382. package/dist/src/utils/logger.js.map +1 -0
  383. package/dist/src/utils/retry.d.ts +10 -0
  384. package/dist/src/utils/retry.d.ts.map +1 -0
  385. package/dist/src/utils/retry.js +71 -0
  386. package/dist/src/utils/retry.js.map +1 -0
  387. package/dist/src/utils/session.d.ts +51 -0
  388. package/dist/src/utils/session.d.ts.map +1 -0
  389. package/dist/src/utils/session.js +160 -0
  390. package/dist/src/utils/session.js.map +1 -0
  391. package/dist/src/utils/template.d.ts +155 -0
  392. package/dist/src/utils/template.d.ts.map +1 -0
  393. package/dist/src/utils/template.js +374 -0
  394. package/dist/src/utils/template.js.map +1 -0
  395. package/docs/CONTRIBUTING.md +521 -0
  396. package/docs/README.md +228 -0
  397. package/docs/api/README.md +3258 -0
  398. package/docs/api/overview.md +1134 -0
  399. package/docs/architecture/data-extraction-flow.md +363 -0
  400. package/docs/core/agent/README.md +902 -0
  401. package/docs/core/agent/context-management.md +796 -0
  402. package/docs/core/agent/session-management.md +641 -0
  403. package/docs/core/ai-integration/prompt-composition.md +220 -0
  404. package/docs/core/ai-integration/providers.md +515 -0
  405. package/docs/core/ai-integration/response-processing.md +287 -0
  406. package/docs/core/conversation-flows/data-collection.md +623 -0
  407. package/docs/core/conversation-flows/route-dsl.md +502 -0
  408. package/docs/core/conversation-flows/routes.md +247 -0
  409. package/docs/core/conversation-flows/step-transitions.md +595 -0
  410. package/docs/core/conversation-flows/steps.md +154 -0
  411. package/docs/core/error-handling.md +638 -0
  412. package/docs/core/persistence/adapters.md +255 -0
  413. package/docs/core/persistence/session-storage.md +644 -0
  414. package/docs/core/routing/intelligent-routing.md +466 -0
  415. package/docs/core/tools/tool-definition.md +970 -0
  416. package/docs/core/tools/tool-scoping.md +819 -0
  417. package/docs/guides/advanced-patterns/publishing.md +186 -0
  418. package/docs/guides/error-handling-patterns.md +578 -0
  419. package/docs/guides/getting-started/README.md +696 -0
  420. package/docs/guides/migration/README.md +72 -0
  421. package/docs/guides/migration/flexible-routing-conditions.md +375 -0
  422. package/docs/guides/migration/response-modal-refactor.md +518 -0
  423. package/examples/advanced-patterns/knowledge-based-agent.ts +735 -0
  424. package/examples/advanced-patterns/persistent-onboarding.ts +728 -0
  425. package/examples/advanced-patterns/route-lifecycle-hooks.ts +556 -0
  426. package/examples/advanced-patterns/streaming-responses.ts +578 -0
  427. package/examples/ai-providers/anthropic-integration.ts +388 -0
  428. package/examples/ai-providers/openai-integration.ts +228 -0
  429. package/examples/condition-patterns/function-only-conditions.ts +365 -0
  430. package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
  431. package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
  432. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  433. package/examples/condition-patterns/string-only-conditions.ts +296 -0
  434. package/examples/conversation-flows/completion-transitions.ts +318 -0
  435. package/examples/core-concepts/basic-agent.ts +503 -0
  436. package/examples/core-concepts/modern-streaming-api.ts +309 -0
  437. package/examples/core-concepts/schema-driven-extraction.ts +332 -0
  438. package/examples/core-concepts/session-management.ts +494 -0
  439. package/examples/integrations/database-integration.ts +630 -0
  440. package/examples/integrations/healthcare-integration.ts +595 -0
  441. package/examples/integrations/search-integration.ts +530 -0
  442. package/examples/integrations/server-session-management.ts +307 -0
  443. package/examples/persistence/custom-adapter.ts +529 -0
  444. package/examples/persistence/database-persistence.ts +583 -0
  445. package/examples/persistence/memory-sessions.ts +495 -0
  446. package/examples/persistence/prisma-schema.example.prisma +74 -0
  447. package/examples/persistence/redis-persistence.ts +488 -0
  448. package/examples/tools/basic-tools.ts +765 -0
  449. package/examples/tools/data-enrichment-tools.ts +593 -0
  450. package/package.json +125 -0
  451. package/src/adapters/MemoryAdapter.ts +273 -0
  452. package/src/adapters/MongoAdapter.ts +304 -0
  453. package/src/adapters/OpenSearchAdapter.ts +670 -0
  454. package/src/adapters/PostgreSQLAdapter.ts +428 -0
  455. package/src/adapters/PrismaAdapter.ts +553 -0
  456. package/src/adapters/RedisAdapter.ts +377 -0
  457. package/src/adapters/SQLiteAdapter.ts +459 -0
  458. package/src/adapters/index.ts +43 -0
  459. package/src/constants/index.ts +10 -0
  460. package/src/core/Agent.ts +970 -0
  461. package/src/core/Events.ts +164 -0
  462. package/src/core/PersistenceManager.ts +353 -0
  463. package/src/core/PromptComposer.ts +253 -0
  464. package/src/core/ResponseEngine.ts +306 -0
  465. package/src/core/ResponseModal.ts +2050 -0
  466. package/src/core/ResponsePipeline.ts +864 -0
  467. package/src/core/Route.ts +677 -0
  468. package/src/core/RoutingEngine.ts +1396 -0
  469. package/src/core/SessionManager.ts +297 -0
  470. package/src/core/Step.ts +593 -0
  471. package/src/core/ToolManager.ts +1394 -0
  472. package/src/index.ts +155 -0
  473. package/src/providers/AnthropicProvider.ts +560 -0
  474. package/src/providers/GeminiProvider.ts +683 -0
  475. package/src/providers/OpenAIProvider.ts +602 -0
  476. package/src/providers/OpenRouterProvider.ts +613 -0
  477. package/src/providers/index.ts +16 -0
  478. package/src/types/agent.ts +196 -0
  479. package/src/types/ai.ts +158 -0
  480. package/src/types/history.ts +206 -0
  481. package/src/types/index.ts +119 -0
  482. package/src/types/persistence.ts +251 -0
  483. package/src/types/route.ts +272 -0
  484. package/src/types/routing.ts +18 -0
  485. package/src/types/schema.ts +23 -0
  486. package/src/types/session.ts +74 -0
  487. package/src/types/template.ts +104 -0
  488. package/src/types/tool.ts +174 -0
  489. package/src/utils/clone.ts +34 -0
  490. package/src/utils/condition.ts +190 -0
  491. package/src/utils/event.ts +16 -0
  492. package/src/utils/history.ts +306 -0
  493. package/src/utils/id.ts +73 -0
  494. package/src/utils/index.ts +69 -0
  495. package/src/utils/json.ts +46 -0
  496. package/src/utils/logger.ts +19 -0
  497. package/src/utils/retry.ts +97 -0
  498. package/src/utils/session.ts +204 -0
  499. package/src/utils/template.ts +444 -0
@@ -0,0 +1,641 @@
1
+ # Session Management
2
+
3
+ ## Overview
4
+
5
+ The `@falai/agent` framework provides **automatic session management** through the `SessionManager` class, eliminating the need for manual session creation, persistence, and state management. Sessions are automatically created, loaded, and saved, allowing developers to focus on building conversation logic rather than managing session lifecycle.
6
+
7
+ ## Core Design Principles
8
+
9
+ ### 1. 🎯 Agent-Level Schema-First Data Extraction
10
+
11
+ Define what data to collect upfront using JSON Schema at the agent level, then extract it reliably across all routes:
12
+
13
+ ```typescript
14
+ // Define your agent-level data contract
15
+ interface TravelData {
16
+ destination: string;
17
+ departureDate: string;
18
+ passengers: number;
19
+ cabinClass: "economy" | "business" | "first";
20
+ hotelPreference?: string;
21
+ budgetRange?: string;
22
+ specialRequests?: string;
23
+ }
24
+
25
+ // Agent with centralized schema
26
+ const agent = new Agent<{}, TravelData>({
27
+ name: "Travel Agent",
28
+ provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
29
+
30
+ // Agent-level schema defines all possible data fields
31
+ schema: {
32
+ type: "object",
33
+ properties: {
34
+ destination: { type: "string" },
35
+ departureDate: { type: "string" },
36
+ passengers: { type: "number", minimum: 1, maximum: 9 },
37
+ cabinClass: {
38
+ type: "string",
39
+ enum: ["economy", "business", "first"],
40
+ default: "economy",
41
+ },
42
+ hotelPreference: { type: "string" },
43
+ budgetRange: { type: "string" },
44
+ specialRequests: { type: "string" }
45
+ },
46
+ required: ["destination", "departureDate", "passengers"],
47
+ }
48
+ });
49
+
50
+ // Routes specify required fields instead of schemas
51
+ const flightRoute = agent.createRoute({
52
+ title: "Book Flight",
53
+ description: "Help user book a flight",
54
+ requiredFields: ["destination", "departureDate", "passengers", "cabinClass"],
55
+ optionalFields: ["specialRequests"]
56
+ });
57
+
58
+ const hotelRoute = agent.createRoute({
59
+ title: "Book Hotel",
60
+ description: "Help user book accommodation",
61
+ requiredFields: ["destination", "departureDate", "hotelPreference"],
62
+ optionalFields: ["budgetRange", "specialRequests"]
63
+ });
64
+ ```
65
+
66
+ **Why?** Agent-level schema-first extraction provides:
67
+
68
+ - **Type Safety** - Full TypeScript types from definition to extraction across all routes
69
+ - **Reliability** - Provider-enforced schemas, not prompt-based parsing
70
+ - **Predictability** - Same data structure every time, shared across routes
71
+ - **Efficiency** - Extract multiple fields in one LLM call
72
+ - **Cross-Route Data Sharing** - Data collected by any route is available to all routes
73
+ - **Route Completion** - Routes complete when their required fields are satisfied
74
+
75
+ ### 2. 🤖 Automatic Session Management
76
+
77
+ Sessions are automatically managed through the `SessionManager` class integrated into every `Agent`:
78
+
79
+ ```typescript
80
+ // Server-side: Agent with automatic session management and agent-level data
81
+ const agent = new Agent<{}, TravelData>({
82
+ name: "Travel Agent",
83
+ provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
84
+ persistence: { adapter: new PrismaAdapter({ prisma }) },
85
+ sessionId: "user-123", // Automatically loads or creates this session
86
+
87
+ // Agent-level schema
88
+ schema: { /* comprehensive travel data schema */ }
89
+ });
90
+
91
+ // Simple conversation - no manual session management
92
+ const response1 = await agent.respond("I want to book a flight to Paris");
93
+ console.log(agent.session.id); // Session ID
94
+ console.log(agent.session.getData<TravelData>()); // Agent-level collected data
95
+
96
+ // Continue conversation - session automatically maintained
97
+ const response2 = await agent.respond("Make that Tokyo instead");
98
+ // Session automatically updated with new data in agent-level structure
99
+
100
+ // Switch to hotel booking - data is shared
101
+ const response3 = await agent.respond("Also book me a hotel in Tokyo");
102
+ // Hotel route can access destination data collected by flight route
103
+ ```
104
+
105
+ **SessionManager API:**
106
+
107
+ The `SessionManager` provides a clean API for session operations with comprehensive error handling:
108
+
109
+ ```typescript
110
+ // Access the session manager
111
+ const sessionManager = agent.session;
112
+
113
+ // Get or create session (works for existing, new, or auto-generated IDs)
114
+ await sessionManager.getOrCreate("user-123");
115
+ await sessionManager.getOrCreate(); // Auto-generates ID
116
+
117
+ // History management with error handling
118
+ try {
119
+ await sessionManager.addMessage("user", "Hello");
120
+ await sessionManager.addMessage("assistant", "Hi there!");
121
+ } catch (error) {
122
+ console.error("Failed to add message to history:", error);
123
+ // Message will be rolled back automatically
124
+ }
125
+
126
+ const history = sessionManager.getHistory();
127
+ sessionManager.clearHistory();
128
+
129
+ // Data access with synchronization
130
+ const data = sessionManager.getData<FlightData>();
131
+ await sessionManager.setData({ destination: "Paris" });
132
+
133
+ // Session operations
134
+ await sessionManager.save(); // Manual save (auto-saves on addMessage)
135
+ await sessionManager.delete();
136
+ const newSession = await sessionManager.reset(true); // Preserve history
137
+ ```
138
+
139
+ ### Agent-Session Data Synchronization
140
+
141
+ The framework ensures bidirectional synchronization between agent collected data and session data:
142
+
143
+ ```typescript
144
+ // Agent data updates automatically sync with session
145
+ const agent = new Agent<{}, BookingData>({
146
+ sessionId: "user-123",
147
+ // ... other config
148
+ });
149
+
150
+ try {
151
+ // Update agent data - automatically syncs with session
152
+ await agent.updateCollectedData({
153
+ destination: "Tokyo",
154
+ passengers: 2
155
+ });
156
+
157
+ // Session data is automatically updated
158
+ const sessionData = agent.session.getData<BookingData>();
159
+ console.log(sessionData.destination); // "Tokyo"
160
+
161
+ // Update session data - automatically syncs with agent
162
+ await agent.session.setData({
163
+ checkInDate: "2025-03-15"
164
+ });
165
+
166
+ // Agent data is automatically updated
167
+ const agentData = agent.getCollectedData();
168
+ console.log(agentData.checkInDate); // "2025-03-15"
169
+
170
+ } catch (error) {
171
+ console.error("Data synchronization failed:", error);
172
+ // Both agent and session data remain in consistent state
173
+ }
174
+ ```
175
+
176
+ ### Error Handling in Data Synchronization
177
+
178
+ ```typescript
179
+ class SessionManager<TData> {
180
+ async setData(data: Partial<TData>): Promise<void> {
181
+ const previousData = { ...this.session.data };
182
+
183
+ try {
184
+ // Validate data if schema is available
185
+ if (this.schema) {
186
+ this.validateData(data);
187
+ }
188
+
189
+ // Update session data
190
+ this.session.data = { ...this.session.data, ...data };
191
+
192
+ // Sync with agent collected data
193
+ if (this.agent) {
194
+ await this.agent.updateCollectedData(data);
195
+ }
196
+
197
+ // Persist changes
198
+ await this.save();
199
+
200
+ } catch (error) {
201
+ // Rollback session data on any failure
202
+ this.session.data = previousData;
203
+
204
+ console.error("Session data update failed, rolled back:", error);
205
+ throw new Error(`Data synchronization failed: ${error.message}`);
206
+ }
207
+ }
208
+
209
+ async addMessage(role: "user" | "assistant", content: string): Promise<void> {
210
+ const message: HistoryItem = {
211
+ role,
212
+ content,
213
+ timestamp: new Date().toISOString()
214
+ };
215
+
216
+ try {
217
+ // Add to session history
218
+ this.session.history.push(message);
219
+
220
+ // Persist immediately for reliability
221
+ await this.save();
222
+
223
+ } catch (error) {
224
+ // Remove message from history on persistence failure
225
+ this.session.history.pop();
226
+
227
+ console.error("Failed to persist message:", error);
228
+ throw new Error(`Message persistence failed: ${error.message}`);
229
+ }
230
+ }
231
+ }
232
+ ```
233
+
234
+ ### Chat Method with Proper Error Handling
235
+
236
+ ```typescript
237
+ class Agent<TContext, TData> {
238
+ async chat(message: string, sessionId?: string): Promise<AgentResponse<TData>> {
239
+ try {
240
+ // Ensure session is loaded
241
+ if (!this.session || this.session.id !== sessionId) {
242
+ await this.loadSession(sessionId);
243
+ }
244
+
245
+ // Add user message to history BEFORE processing
246
+ await this.session.addMessage("user", message);
247
+
248
+ // Process the message
249
+ const response = await this.respond({
250
+ message,
251
+ sessionId: this.session.id
252
+ });
253
+
254
+ // Add assistant response to history
255
+ if (response.message) {
256
+ await this.session.addMessage("assistant", response.message);
257
+ }
258
+
259
+ return response;
260
+
261
+ } catch (error) {
262
+ console.error("Chat method failed:", error);
263
+
264
+ // Try to remove the user message if response failed
265
+ try {
266
+ const history = this.session.getHistory();
267
+ if (history.length > 0 && history[history.length - 1].role === "user") {
268
+ await this.session.removeLastMessage();
269
+ }
270
+ } catch (rollbackError) {
271
+ console.error("Failed to rollback user message:", rollbackError);
272
+ }
273
+
274
+ throw new Error(`Chat failed: ${error.message}`);
275
+ }
276
+ }
277
+ }
278
+ ```
279
+
280
+ **Why?** Automatic session management provides:
281
+
282
+ - **Zero Boilerplate** - No manual session creation or persistence code
283
+ - **Server-Friendly** - Perfect for stateless server environments
284
+ - **Always-on Routing** - Users can change their mind mid-conversation
285
+ - **Context Awareness** - Router sees current progress and collected data
286
+ - **Data Persistence** - Collected data automatically saved and restored
287
+ - **History Management** - Conversation history automatically maintained
288
+ - **Session Tracking** - Easy session identification for client/server communication
289
+
290
+ ### 3. 🔧 Code-Based Step Logic + AI-Driven Transitions
291
+
292
+ Use TypeScript functions for deterministic flow control AND text conditions for AI-driven step selection:
293
+
294
+ ```typescript
295
+ // Step with smart bypassing based on collected data
296
+ const askDestination = route.initialStep.nextStep({
297
+ id: "ask_destination", // Optional: custom step ID
298
+ prompt: "Ask where they want to fly",
299
+ collect: ["destination"],
300
+ skipIf: (data) => !!data.destination, // Code-based condition!
301
+ condition: "Customer hasn't specified destination yet", // Text condition for AI
302
+ });
303
+
304
+ const askDate = askDestination.nextStep({
305
+ id: "ask_date", // Optional: custom step ID for easier tracking
306
+ prompt: "Ask about travel dates",
307
+ collect: ["departureDate"],
308
+ skipIf: (data) => !!data.departureDate,
309
+ requires: ["destination"], // Prerequisites
310
+ condition: "Destination confirmed, need travel dates now",
311
+ });
312
+ });
313
+ ```
314
+
315
+ **Custom Step IDs:**
316
+
317
+ You can optionally provide custom IDs for steps to make them easier to track and reference:
318
+
319
+ ```typescript
320
+ const confirmBooking = askDate.nextStep({
321
+ id: "confirm_booking", // ✅ Custom ID instead of auto-generated
322
+ prompt: "Confirm all booking details",
323
+ requires: ["destination", "departureDate", "passengers"],
324
+ });
325
+ ```
326
+
327
+ If you don't provide an ID, one is automatically generated from the route ID and step description.
328
+
329
+ **Why?** Code-based logic provides:
330
+
331
+ - **Predictability** - No fuzzy LLM interpretation of conditions
332
+ - **Performance** - No extra LLM calls for condition checking
333
+ - **Debugging** - Clear logic flow you can trace
334
+ - **Type Safety** - Full TypeScript support for data validation
335
+ - **Custom IDs** - Easier tracking and debugging with meaningful step identifiers
336
+
337
+ **How Step Transitions Work:**
338
+
339
+ 1. **Code filters first**: `skipIf` and `requires` filter out invalid steps deterministically
340
+ 2. **AI selects best step**: From valid candidates, AI evaluates text conditions to choose optimal step
341
+ 3. **Combined decision**: Single AI call handles both route selection AND step selection (no extra calls!)
342
+ 4. **Completion detection**: When all steps are skipped and `END_ROUTE` is reached, route is marked complete
343
+
344
+ ```typescript
345
+ // The AI sees:
346
+ // "Available steps: askDate, confirmBooking
347
+ // - askDate: Destination confirmed, need travel dates now
348
+ // - confirmBooking: All required info collected, ready to book
349
+ // Current data: {destination: 'Paris', departureDate: '2025-01-15'}
350
+ //
351
+ // → AI selects 'confirmBooking' based on context"
352
+ ```
353
+
354
+ ### 4. 🛠️ Tools with Data Access
355
+
356
+ Tools execute with full context including collected data:
357
+
358
+ ```typescript
359
+ import { Tool } from "@falai/agent";
360
+
361
+ const searchFlights: Tool<Context, [], void, FlightData> = {
362
+ id: "search_flights",
363
+ description: "Search for available flights based on collected data",
364
+ parameters: {
365
+ type: "object",
366
+ properties: {},
367
+ },
368
+ handler: async (toolContext) => {
369
+ const { data, context, history } = toolContext;
370
+
371
+ // Access collected data directly
372
+ if (!data.destination || !data.departureDate) {
373
+ return { data: undefined };
374
+ }
375
+
376
+ // Enrich collected data
377
+ return {
378
+ data: undefined,
379
+ dataUpdate: {
380
+ destinationCode: await lookupAirportCode(data.destination),
381
+ departureDateParsed: parseDate(data.departureDate),
382
+ },
383
+ };
384
+ },
385
+ };
386
+ ```
387
+
388
+ **Why?** Tools with data access enable:
389
+
390
+ - **Data Enrichment** - Tools can validate and enhance collected data
391
+ - **Computed Fields** - Calculate derived values from collected data
392
+ - **Conditional Execution** - Tools decide what to do based on data step
393
+ - **Action Flags** - Tools can set flags for subsequent operations
394
+
395
+ ### 5. 🎭 Always-On Routing
396
+
397
+ Routing happens every turn, allowing users to change direction:
398
+
399
+ ```typescript
400
+ // User starts booking a flight
401
+ const response1 = await agent.respond({
402
+ history: [
403
+ {
404
+ role: "user",
405
+ content: "I want to fly to Paris",
406
+ },
407
+ ],
408
+ session,
409
+ });
410
+
411
+ // User changes mind mid-conversation
412
+ const response2 = await agent.respond({
413
+ history: [
414
+ ...previousHistory,
415
+ {
416
+ role: "user",
417
+ content: "Actually, make that Tokyo instead",
418
+ },
419
+ ],
420
+ session: response1.session, // Router sees context and switches appropriately
421
+ });
422
+ ```
423
+
424
+ **Why?** Always-on routing provides:
425
+
426
+ - **User Control** - Users can change their mind naturally
427
+ - **Context Awareness** - Router considers current progress
428
+ - **Graceful Transitions** - Smooth handling of intent changes
429
+ - **No Dead Ends** - Always a valid next step
430
+
431
+ ### 6. 🔄 Three-Phase Pipeline
432
+
433
+ Clean separation of concerns in every response:
434
+
435
+ ```
436
+ 1. PREPARATION → 2. ROUTING → 3. RESPONSE
437
+ ```
438
+
439
+ **Phase 1: Preparation**
440
+
441
+ - Execute tools if current step has `tool`
442
+ - Update context with tool results
443
+ - Enrich collected data if tools return `dataUpdate`
444
+
445
+ **Phase 2: Routing**
446
+
447
+ - Build dynamic routing schema (scores for all routes 0-100)
448
+ - Include session context in routing prompt
449
+ - AI selects best route based on current step
450
+ - Update session if route changed
451
+
452
+ **Phase 3: Response**
453
+
454
+ - Determine next step using `skipIf` and `requires`
455
+ - Build response schema including current step's `collect` fields
456
+ - Generate message with schema-enforced data extraction
457
+ - Update session with newly collected data
458
+
459
+ **Why?** This architecture enables:
460
+
461
+ - **Efficiency** - 1-2 LLM calls per turn vs 3-5 in condition-heavy approaches
462
+ - **Reliability** - Tools execute before AI sees the conversation
463
+ - **Flexibility** - Always-on routing handles any user direction
464
+ - **Type Safety** - Schemas ensure consistent data structures
465
+
466
+ ### 7. 📦 Enhanced Lifecycle Hooks
467
+
468
+ Hooks for validation, enrichment, and persistence:
469
+
470
+ ```typescript
471
+ const agent = new Agent({
472
+ // ... other options
473
+ hooks: {
474
+ // Refresh context before each response
475
+ beforeRespond: async (ctx) => {
476
+ return await loadFreshContext(ctx.userId);
477
+ },
478
+
479
+ // Persist context updates
480
+ onContextUpdate: async (newCtx, oldCtx) => {
481
+ await saveContext(newCtx);
482
+ },
483
+
484
+ // Validate and enrich collected data
485
+ onDataUpdate: async (data, previous) => {
486
+ // Normalize data
487
+ if (data.passengers < 1) data.passengers = 1;
488
+
489
+ // Auto-trigger actions
490
+ if (hasAllRequires(data)) {
491
+ data.shouldSearchFlights = true;
492
+ }
493
+
494
+ return data;
495
+ },
496
+ },
497
+ });
498
+ ```
499
+
500
+ **Why?** Lifecycle hooks provide:
501
+
502
+ - **Data Validation** - Ensure collected data meets business rules
503
+ - **Enrichment** - Add computed fields or normalize values
504
+ - **Persistence** - Save/restore conversation step
505
+ - **Integration** - Connect with external systems
506
+
507
+ ## Comparison with Other Approaches
508
+
509
+ ### @falai/agent vs Traditional Step Machines
510
+
511
+ | Aspect | @falai/agent (Data-Driven) | Traditional Step Machines |
512
+ | ------------------- | -------------------------- | ------------------------------------- |
513
+ | **Step Logic** | Code-based (`skipIf`) | Manual condition checking |
514
+ | **Data Collection** | Schema-driven extraction | Manual parsing |
515
+ | **Type Safety** | Full TypeScript | Often runtime validation |
516
+ | **LLM Calls/Turn** | 1-2 (routing + response) | 3-5 (conditions + routing + response) |
517
+ | **Validation** | Code + schemas | Manual implementation |
518
+ | **Routing** | Always-on, context-aware | Route-only, rigid |
519
+
520
+ ### @falai/agent vs OpenAI Function Calling
521
+
522
+ | Aspect | @falai/agent | OpenAI Functions |
523
+ | ------------------ | ------------------------ | ----------------------------- |
524
+ | **Tool Execution** | Automatic (step-driven) | AI-decided |
525
+ | **Flow Control** | Code-based step logic | AI inference |
526
+ | **Determinism** | High - code-driven flow | Low - AI may vary |
527
+ | **Data Handling** | Structured schemas | Unstructured function results |
528
+ | **Type Safety** | Full TypeScript | Runtime type checking |
529
+ | **Use Case** | Structured conversations | Flexible, open-ended tasks |
530
+
531
+ ## When to Use @falai/agent
532
+
533
+ ✅ **Great for:**
534
+
535
+ - **Data Collection Flows** - Booking, onboarding, forms, surveys
536
+ - **Multi-Step Processes** - Complex workflows with clear progression
537
+ - **Type-Safe Applications** - When data structure matters
538
+ - **Predictable Conversations** - Structured, goal-oriented interactions
539
+ - **Session-Based Apps** - Conversations that span multiple turns
540
+
541
+ ❌ **Not ideal for:**
542
+
543
+ - **Open-Ended Chat** - General conversation without clear goals
544
+ - **Creative Tasks** - Brainstorming, writing, ideation
545
+ - **Simple Q&A** - Stepless question-answering (use stepless routes!)
546
+ - **Rapid Prototyping** - When you need maximum flexibility
547
+
548
+ ## Architecture Patterns
549
+
550
+ ### Stepful Routes (Data Collection)
551
+
552
+ For structured data collecting with step management:
553
+
554
+ ```typescript
555
+ interface BookingData {
556
+ destination: string;
557
+ dates: string;
558
+ passengers: number;
559
+ }
560
+
561
+ const bookingRoute = agent.createRoute<BookingData>({
562
+ title: "Flight Booking",
563
+ schema: {
564
+ /* schema for all fields */
565
+ },
566
+ });
567
+
568
+ bookingRoute.initialStep
569
+ .nextStep({
570
+ prompt: "Ask destination",
571
+ collect: ["destination"],
572
+ skipIf: (data) => !!data.destination,
573
+ })
574
+ .nextStep({
575
+ tool: enrichDestination, // Validates and enriches
576
+ requires: ["destination"],
577
+ })
578
+ .nextStep({
579
+ prompt: "Ask dates",
580
+ collect: ["dates"],
581
+ skipIf: (data) => !!data.dates,
582
+ });
583
+ ```
584
+
585
+ ### Stepless Routes (Q&A)
586
+
587
+ For simple question-answering without step:
588
+
589
+ ```typescript
590
+ const qnaRoute = agent.createRoute({
591
+ title: "Company Q&A",
592
+ when: ["User asks about company"],
593
+ // NO schema - stepless!
594
+ });
595
+
596
+ // Just use initial step
597
+ qnaRoute.initialStep.prompt = "Answer from knowledge base";
598
+ ```
599
+
600
+ ### Mixed Architecture
601
+
602
+ Combine both patterns in one agent:
603
+
604
+ ```typescript
605
+ // Q&A routes (stepless)
606
+ const companyInfoRoute = agent.createRoute({
607
+ /* no schema */
608
+ });
609
+ const productInfoRoute = agent.createRoute({
610
+ /* no schema */
611
+ });
612
+
613
+ // Booking routes (stepful)
614
+ const bookingRoute = agent.createRoute<BookingData>({
615
+ /* with schema */
616
+ });
617
+ const supportRoute = agent.createRoute<SupportData>({
618
+ /* with schema */
619
+ });
620
+ ```
621
+
622
+ ## Design Influences
623
+
624
+ This framework draws inspiration from:
625
+
626
+ 1. **Schema-First APIs** - JSON Schema for data contracts
627
+ 2. **Step Machines** - Explicit step modeling for predictability
628
+ 3. **TypeScript** - Full type safety throughout
629
+ 4. **Functional Programming** - Pure functions for step logic
630
+ 5. **React Hooks** - Lifecycle patterns for extensibility
631
+
632
+ ## Further Reading
633
+
634
+ - [Getting Started Guide](../guides/getting-started/README.md) - Build your first agent
635
+ - [Session Step Guide](./CONTEXT_MANAGEMENT.md) - Session management patterns
636
+ - [API Reference](../api/README.md) - Complete API documentation
637
+ - [Examples](../examples/) - Real-world implementations
638
+
639
+ ---
640
+
641
+ **Questions?** Open an issue or discussion on [GitHub](https://github.com/falai-dev/agent).