@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
package/README.md ADDED
@@ -0,0 +1,797 @@
1
+ <div align="center">
2
+
3
+ # 🤖 @falai/agent
4
+
5
+ ### Type-Safe AI Conversational Agents That Actually Work in Production
6
+
7
+ **Schema-driven data extraction • Predictable conversations • Enterprise-ready**
8
+
9
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.3+-blue.svg)](https://www.typescriptlang.org/)
10
+ [![License](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE)
11
+ [![Bun](https://img.shields.io/badge/bun-compatible-orange.svg)](https://bun.sh)
12
+ [![Website](https://img.shields.io/badge/🌐-falai.dev-brightgreen.svg)](https://falai.dev)
13
+
14
+ [🌐 Website](https://falai.dev) • [Features](#-features) • [Installation](#-installation) • [Quick Start](#-quick-start) • [Documentation](#-documentation) • [Examples](#-examples)
15
+
16
+ </div>
17
+
18
+ ---
19
+
20
+ ## ⚡ The @falai/agent Difference
21
+
22
+ ### Traditional AI Chat:
23
+
24
+ ```typescript
25
+ // User: "I want to book the Grand Hotel for 2 people next Friday"
26
+ // AI: "Sure! Which hotel would you like?" // 😠 Asked already!
27
+ // User: "Grand Hotel"
28
+ // AI: "How many guests?" // 😠 You just told me!
29
+ // User: "2 people"
30
+ // AI: "What date?" // 😠 I said Friday!
31
+ ```
32
+
33
+ ### With @falai/agent:
34
+
35
+ ```typescript
36
+ // User: "I want to book the Grand Hotel for 2 people next Friday"
37
+ // AI: "Perfect! Booking confirmed for 2 guests at Grand Hotel on Friday!"
38
+ // ✅ Extracted all data from one message
39
+ // ✅ Skipped unnecessary steps
40
+ // ✅ Completed immediately
41
+ ```
42
+
43
+ **No more repetitive questions. No more guessing what the AI will ask next.**
44
+
45
+ **Intelligent Pre-Extraction** - AI automatically captures ALL relevant data from user messages, then determines which step to start at based on what's missing.
46
+
47
+ ---
48
+
49
+ ## 🤔 Why @falai/agent?
50
+
51
+ After building production AI applications, we found existing solutions either:
52
+
53
+ - **Too unpredictable** - AI decides everything, including which tools to call (unreliable in production)
54
+ - **Too complex** - Heavy Python frameworks with massive dependencies
55
+ - **Too basic** - No structured data extraction or step management
56
+
57
+ @falai/agent gives you **predictable AI** - the creativity of LLMs with the reliability of code.
58
+
59
+ **The key insight:** Let AI do what it's good at (understanding intent, generating responses, extracting data), and let TypeScript handle the rest (step logic, tool execution, validation).
60
+
61
+ ---
62
+
63
+ ## 🌟 Features
64
+
65
+ <table>
66
+ <tr>
67
+ <td width="50%">
68
+
69
+ ### 🎯 **Developer Experience**
70
+
71
+ - **Fully Type-Safe** - Generic `Agent<TContext>` with complete inference
72
+ - **Fluent API** - Chainable methods for elegant code
73
+ - **Modular Design** - Use what you need, when you need it
74
+
75
+ </td>
76
+ <td width="50%">
77
+
78
+ ### 🚀 **Production Ready**
79
+
80
+ - **Robust Retry Logic** - Exponential backoff & backup models
81
+ - **AI Provider Strategy** - Pluggable backends (Claude, Gemini, OpenAI, OpenRouter)
82
+ - **Prompt Composition** - Sophisticated prompt building system
83
+
84
+ </td>
85
+ </tr>
86
+ <tr>
87
+ <td width="50%">
88
+
89
+ ### 🛤️ **Data-Driven Conversations**
90
+
91
+ - **Intelligent Pre-Extraction** - Automatically extract data BEFORE entering steps
92
+ - **Schema-First Extraction** - Define data contracts with JSON Schema
93
+ - **Automatic Route Completion** - Routes complete when required fields are collected
94
+ - **Smart Step Skipping** - Skip steps whose data is already present
95
+ - **Always-On Routing** - Context-aware routing between different flows
96
+
97
+ </td>
98
+ <td width="50%">
99
+
100
+ ### 🔧 **Tools & Data Integration**
101
+
102
+ - **Advanced Tool System** - Context-aware tools with data access and lifecycle integration
103
+ - **Dynamic Tool Calling** - AI can call tools during streaming responses
104
+ - **Tool Result Processing** - Tools update context and collected data automatically
105
+
106
+ </td>
107
+ </tr>
108
+ <tr>
109
+ <td width="50%">
110
+
111
+ ### 💾 **Optional Persistence**
112
+
113
+ - **Auto-Save** - Automatically persist conversation data and progress
114
+ - **Extensible Adapters** - Use built-in (Prisma, Redis, etc.) or create your own
115
+ - **Custom DB Support** - Integrate with your existing database schemas
116
+
117
+ </td>
118
+ <td width="50%">
119
+
120
+ ### 🎯 **Session-Aware Routing**
121
+
122
+ - **Always-On Routing** - Users can change their mind mid-conversation
123
+ - **Context Awareness** - Router sees current progress and collected data
124
+
125
+ </td>
126
+ </tr>
127
+ <tr>
128
+ <td width="50%">
129
+
130
+ ### 🚀 **Advanced Features**
131
+
132
+ - **Streaming Responses** - Real-time response generation with tool execution
133
+ - **Lifecycle Hooks** - `prepare`/`finalize` functions or tools on steps, context/data update hooks
134
+ - **Sequential Steps** - Define linear conversation flows with `steps` array
135
+ - **Route Transitions** - Automatic flow transitions when routes complete
136
+ - **Smart Step Control** - `skipIf` and `requires` for data-driven flow control
137
+
138
+ </td>
139
+ <td width="50%">
140
+
141
+ ### 🎨 **Behavioral Control**
142
+
143
+ - **Guidelines & Rules** - Define agent behavior patterns and restrictions
144
+ - **Route-Specific Logic** - Different rules for different conversation contexts
145
+ - **Knowledge Base** - Structured information available to AI during responses
146
+ - **Session Step** - Track conversation progress across turns
147
+
148
+ </td>
149
+ </tr>
150
+ </table>
151
+
152
+ ---
153
+
154
+ ## 📦 Installation
155
+
156
+ ```bash
157
+ # Using bun (recommended)
158
+ bun add @falai/agent
159
+
160
+ # Using npm
161
+ npm install @falai/agent
162
+
163
+ # Using yarn
164
+ yarn add @falai/agent
165
+ ```
166
+
167
+ > **Requirements:** Node.js 18+ or Bun 1.0+
168
+
169
+ ---
170
+
171
+ ## 🚀 Quick Start
172
+
173
+ ### Level 1: Your First Agent (30 seconds)
174
+
175
+ Create a minimal conversational agent:
176
+
177
+ ```typescript
178
+ import {
179
+ Agent,
180
+ GeminiProvider,
181
+ createMessageEvent,
182
+ EventSource,
183
+ } from "@falai/agent";
184
+
185
+ // Create your agent
186
+ const agent = new Agent({
187
+ name: "Assistant",
188
+ description: "A helpful assistant",
189
+ provider: new GeminiProvider({
190
+ apiKey: process.env.GEMINI_API_KEY!,
191
+ model: "models/gemini-2.5-flash",
192
+ }),
193
+ });
194
+
195
+ // Create a simple route with sequential steps
196
+ agent.createRoute({
197
+ title: "General Help",
198
+ description: "Answers user questions",
199
+ when: ["User needs help or asks a question"],
200
+ steps: [
201
+ {
202
+ id: "answer_question",
203
+ description: "Answer the user's question helpfully",
204
+ prompt: "Answer the user's question helpfully",
205
+ },
206
+ ],
207
+ });
208
+
209
+ // Start chatting - simple message-based API
210
+ const response = await agent.respond("What can you do?");
211
+
212
+ console.log(response.message);
213
+ ```
214
+
215
+ **That's it!** You now have a working conversational AI agent.
216
+
217
+ ---
218
+
219
+ ## 🎯 Advanced Routing with ConditionTemplate
220
+
221
+ ### Flexible Route Conditions
222
+
223
+ Routes now support powerful condition patterns that combine AI context with programmatic logic:
224
+
225
+ ```typescript
226
+ // String-only conditions (AI context for routing decisions)
227
+ agent.createRoute({
228
+ title: "Customer Support",
229
+ when: "User needs help with their account",
230
+ steps: [/* ... */]
231
+ });
232
+
233
+ // Function-only conditions (programmatic evaluation)
234
+ agent.createRoute({
235
+ title: "Premium Features",
236
+ when: (ctx) => ctx.data?.userType === 'premium',
237
+ steps: [/* ... */]
238
+ });
239
+
240
+ // Mixed array conditions (AI context + programmatic logic)
241
+ agent.createRoute({
242
+ title: "Booking Assistance",
243
+ when: [
244
+ "User wants to make a reservation", // AI context
245
+ (ctx) => ctx.data?.isLoggedIn === true // Programmatic check
246
+ ],
247
+ steps: [/* ... */]
248
+ });
249
+
250
+ // Route skipIf - exclude routes dynamically
251
+ agent.createRoute({
252
+ title: "Payment Processing",
253
+ when: ["User wants to make a payment"],
254
+ skipIf: [
255
+ "Payment system is under maintenance", // AI context
256
+ (ctx) => ctx.data?.paymentBlocked === true // Programmatic check
257
+ ],
258
+ steps: [/* ... */]
259
+ });
260
+ ```
261
+
262
+ ### Enhanced Step Conditions
263
+
264
+ Steps support the same flexible condition patterns:
265
+
266
+ ```typescript
267
+ agent.createRoute({
268
+ title: "Order Process",
269
+ steps: [
270
+ {
271
+ id: "collect_items",
272
+ when: "User wants to add items to cart",
273
+ prompt: "What would you like to order?",
274
+ collect: ["items"]
275
+ },
276
+ {
277
+ id: "payment_step",
278
+ when: [
279
+ "Ready to process payment", // AI context
280
+ (ctx) => ctx.data?.items?.length > 0 // Programmatic check
281
+ ],
282
+ skipIf: (ctx) => ctx.data?.paymentComplete === true,
283
+ prompt: "Let's process your payment",
284
+ tools: ["process_payment"]
285
+ },
286
+ {
287
+ id: "confirmation",
288
+ when: "Order is ready for confirmation",
289
+ skipIf: [
290
+ "Order already confirmed", // AI context
291
+ (ctx) => ctx.data?.orderConfirmed === true // Programmatic check
292
+ ],
293
+ prompt: "Your order is confirmed!",
294
+ finalize: "send_confirmation_email"
295
+ }
296
+ ]
297
+ });
298
+ ```
299
+
300
+ ### Dynamic Guidelines
301
+
302
+ Guidelines now support flexible conditions for context-aware behavior:
303
+
304
+ ```typescript
305
+ // Add guidelines with mixed condition types
306
+ agent.addGuideline({
307
+ title: "Premium User Support",
308
+ condition: [
309
+ "User is asking for help", // AI context
310
+ (ctx) => ctx.data?.userType === 'premium' // Programmatic check
311
+ ],
312
+ content: "Provide priority support with detailed explanations and offer direct phone support."
313
+ });
314
+
315
+ agent.addGuideline({
316
+ title: "Maintenance Mode",
317
+ condition: "System maintenance is active",
318
+ content: "Inform users about scheduled maintenance and provide estimated completion time."
319
+ });
320
+
321
+ // Function-only guideline for specific conditions
322
+ agent.addGuideline({
323
+ title: "High Value Customer",
324
+ condition: (ctx) => ctx.data?.totalSpent > 10000,
325
+ content: "Offer VIP treatment and exclusive deals."
326
+ });
327
+ ```
328
+
329
+ **Key Benefits:**
330
+
331
+ - ✅ **Hybrid Logic** - Combine AI understanding with programmatic precision
332
+ - ✅ **Context Awareness** - AI sees string conditions for better routing decisions
333
+ - ✅ **Performance** - Functions execute first, strings only used when needed
334
+ - ✅ **Flexibility** - Use simple strings, functions, or arrays as needed
335
+
336
+ ---
337
+
338
+ ## 🔧 Advanced Step Configuration
339
+
340
+ ### Simple Tool Creation
341
+
342
+ Create tools with minimal boilerplate using the unified Tool interface:
343
+
344
+ ```typescript
345
+ // Create a simple tool with the unified interface
346
+ agent.addTool({
347
+ id: "validate_user",
348
+ name: "User Data Validator",
349
+ description: "Validate user data before processing",
350
+ parameters: { type: "object", properties: {} },
351
+ handler: async ({ context, data, updateData }) => {
352
+ // Validation logic with helper methods
353
+ if (!data.email?.includes("@")) {
354
+ throw new Error("Invalid email address");
355
+ }
356
+
357
+ // Mark as validated using helper method
358
+ await updateData({ emailValidated: true });
359
+
360
+ return "User validation completed successfully";
361
+ },
362
+ });
363
+
364
+ // Use tools in conversation flows and step lifecycle
365
+ agent.createRoute({
366
+ title: "User Registration",
367
+ steps: [
368
+ {
369
+ id: "collect_info",
370
+ description: "Collect user information",
371
+ collect: ["name", "email"],
372
+ prompt: "Please provide your name and email.",
373
+ prepare: "validate_user", // Tool executes before AI response
374
+ tools: ["validate_user"], // Tool available during conversation
375
+ },
376
+ ],
377
+ });
378
+ ```
379
+
380
+ **Benefits:**
381
+
382
+ - ✅ **Simple API** - Unified Tool interface with minimal complexity
383
+ - ✅ **Type Safety** - Full TypeScript support with automatic inference
384
+ - ✅ **Flexible Returns** - Return simple values or complex ToolResult objects
385
+ - ✅ **Helper Methods** - Built-in context and data update utilities
386
+ - ✅ **Lifecycle Integration** - Use tools as prepare/finalize hooks in steps
387
+
388
+ ---
389
+
390
+ ### Level 2: Data Extraction (The Real Power)
391
+
392
+ Now let's build an agent that intelligently collects structured data:
393
+
394
+ ```typescript
395
+ import {
396
+ Agent,
397
+ OpenAIProvider,
398
+ createMessageEvent,
399
+ EventSource,
400
+ } from "@falai/agent";
401
+
402
+ // 1️⃣ Define the data you want to collect
403
+ interface HotelBookingData {
404
+ hotelName: string;
405
+ date: string;
406
+ guests: number;
407
+ }
408
+
409
+ // 2️⃣ Create your agent with centralized data schema
410
+ const agent = new Agent<{}, HotelBookingData>({
411
+ name: "BookingBot",
412
+ description: "A hotel booking assistant that collects information.",
413
+ provider: new OpenAIProvider({
414
+ apiKey: process.env.OPENAI_API_KEY,
415
+ model: "gpt-4", // or your preferred model
416
+ }),
417
+
418
+ // Agent-level schema defines all possible data fields
419
+ schema: {
420
+ type: "object",
421
+ properties: {
422
+ hotelName: { type: "string", description: "The name of the hotel." },
423
+ date: { type: "string", description: "The desired booking date." },
424
+ guests: { type: "number", description: "The number of guests." },
425
+ },
426
+ required: ["hotelName", "date", "guests"],
427
+ },
428
+
429
+ // Agent-level data validation and enrichment
430
+ hooks: {
431
+ onDataUpdate: async (data, previousData) => {
432
+ // Auto-validate and enrich data
433
+ if (data.guests && data.guests > 10) {
434
+ throw new Error("Maximum 10 guests allowed");
435
+ }
436
+ return data;
437
+ }
438
+ }
439
+ });
440
+
441
+ // 3️⃣ Define a tool using the unified Tool interface
442
+ agent.addTool({
443
+ id: "book_hotel",
444
+ name: "Hotel Booking System",
445
+ description: "Books a hotel once all information is collected.",
446
+ parameters: { type: "object", properties: {} },
447
+ handler: async ({ context, data, updateContext }) => {
448
+ // Tool receives complete agent data with simplified context and helper methods
449
+ const bookingId = await hotelAPI.createBooking({
450
+ hotel: data.hotelName,
451
+ date: data.date,
452
+ guests: data.guests,
453
+ });
454
+
455
+ // Use helper method to update context
456
+ await updateContext({
457
+ lastBookingId: bookingId,
458
+ lastBookingDate: new Date().toISOString(),
459
+ });
460
+
461
+ return `Booking confirmed! Confirmation #${bookingId} for ${data.guests} guests at ${data.hotelName} on ${data.date}`;
462
+ },
463
+ });
464
+
465
+ // 4️⃣ Create a route with required fields specification
466
+ agent.createRoute({
467
+ title: "Book Hotel",
468
+ description: "Guides the user through the hotel booking process.",
469
+ when: ["User wants to book a hotel"],
470
+ requiredFields: ["hotelName", "date", "guests"], // Required for route completion
471
+
472
+ // 5️⃣ Define the flow to collect data step-by-step
473
+ steps: [
474
+ {
475
+ id: "ask_hotel",
476
+ description: "Ask which hotel they want to book",
477
+ prompt: "Which hotel would you like to book?",
478
+ collect: ["hotelName"],
479
+ skipIf: (data: Partial<HotelBookingData>) => !!data.hotelName,
480
+ },
481
+ {
482
+ id: "ask_date",
483
+ description: "Ask for the booking date",
484
+ prompt: "What date would you like to book for?",
485
+ collect: ["date"],
486
+ requires: ["hotelName"], // Prerequisites from agent data
487
+ skipIf: (data: Partial<HotelBookingData>) => !!data.date,
488
+ },
489
+ {
490
+ id: "ask_guests",
491
+ description: "Ask for the number of guests",
492
+ prompt: "How many guests will be staying?",
493
+ collect: ["guests"],
494
+ requires: ["hotelName", "date"], // Prerequisites from agent data
495
+ skipIf: (data: Partial<HotelBookingData>) => data.guests !== undefined,
496
+ },
497
+ {
498
+ id: "confirm_booking",
499
+ description: "Confirm and book the hotel",
500
+ prompt: "Let me confirm your booking details.",
501
+ tools: ["book_hotel"], // Reference tool by ID
502
+ requires: ["hotelName", "date", "guests"],
503
+ },
504
+ ],
505
+ });
506
+
507
+ // 5️⃣ Start conversing - simple message API
508
+ const response = await agent.respond("I want to book a room at the Grand Hotel for 2 people.");
509
+
510
+ // The agent sees that `hotelName` and `guests` are provided,
511
+ // skips the first and third steps, and only asks for the date.
512
+ console.log(response.message);
513
+ // Expected: "What date would you like to book for?"
514
+ ```
515
+
516
+ **That's it!** The data-driven agent will:
517
+
518
+ - ✅ **Understand the Goal** - Route to the `Book Hotel` flow based on user intent.
519
+ - ✅ **Extract Known Data** - Automatically pull `hotelName` and `guests` from the first message.
520
+ - ✅ **Skip Unneeded Steps** - Use `skipIf` to bypass questions for data it already has.
521
+ - ✅ **Collect Missing Data** - Intelligently ask only for the missing `date`.
522
+ - ✅ **Execute Deterministically** - Call the `bookHotel` tool only when all required data is present.
523
+
524
+ This creates a flexible and natural conversation, guided by a clear data structure.
525
+
526
+ 📖 **[See more examples →](./examples/)** | **[Full tutorial →](./docs/guides/getting-started/README.md)**
527
+
528
+ ### ⚡ Advanced Features
529
+
530
+ **Streaming responses** for real-time UX:
531
+
532
+ ```typescript
533
+ for await (const chunk of agent.respondStream("Hello")) {
534
+ process.stdout.write(chunk.delta);
535
+ if (chunk.done) {
536
+ console.log("\nTool calls:", chunk.toolCalls);
537
+ }
538
+ }
539
+ ```
540
+
541
+ **Automatic session management** for multi-turn conversations:
542
+
543
+ ```typescript
544
+ // Server-side: Create agent with sessionId
545
+ const agent = new Agent({
546
+ name: "Assistant",
547
+ provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
548
+ persistence: { adapter: new PrismaAdapter({ prisma }) },
549
+ sessionId: "user-123" // Automatically loads or creates session
550
+ });
551
+
552
+ // Simple conversation - no manual session management needed
553
+ const response = await agent.respond("Hello, how are you?");
554
+ console.log(response.message);
555
+ console.log(agent.session.id); // Session ID for client
556
+ ```
557
+
558
+ **Automatic session persistence** with any adapter:
559
+
560
+ ```typescript
561
+ import { PrismaAdapter } from "@falai/agent";
562
+
563
+ // Server endpoint - sessions managed automatically
564
+ app.post('/chat', async (req, res) => {
565
+ const { sessionId, message } = req.body;
566
+
567
+ const agent = new Agent({
568
+ name: "ChatBot",
569
+ provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
570
+ persistence: { adapter: new PrismaAdapter({ prisma }) },
571
+ sessionId // Automatically loads or creates this session
572
+ });
573
+
574
+ const response = await agent.respond(message);
575
+
576
+ res.json({
577
+ message: response.message,
578
+ sessionId: agent.session.id, // Return session ID to client
579
+ isComplete: response.isRouteComplete
580
+ });
581
+ });
582
+ ```
583
+
584
+ 📖 **[See full feature docs →](./docs)**
585
+
586
+ ---
587
+
588
+ ## 📚 Documentation
589
+
590
+ 📋 **[Complete Documentation Index →](docs/README.md)** - Searchable index of all docs
591
+
592
+ ### 🚀 Getting Started
593
+
594
+ - **[Quick Start Guide](./docs/guides/getting-started/README.md)** - Build your first agent in 15 minutes
595
+
596
+ ### 🏗️ Core Framework
597
+
598
+ - **[Agent Orchestration](./docs/core/agent/README.md)** - Agent lifecycle, configuration & hooks
599
+ - **[Context Management](./docs/core/agent/context-management.md)** - Dynamic context providers & updates
600
+ - **[Session Management](./docs/core/agent/session-management.md)** - Session persistence & state
601
+
602
+ ### 💬 Conversation Flows
603
+
604
+ - **[Routes](./docs/core/conversation-flows/routes.md)** - Route definition & lifecycle
605
+ - **[Steps](./docs/core/conversation-flows/steps.md)** - Step transitions & logic
606
+
607
+ ### 🤖 AI Integration
608
+
609
+ - **[AI Providers](./docs/core/ai-integration/providers.md)** - Gemini, OpenAI, Anthropic, OpenRouter
610
+ - **[Prompt Composition](./docs/core/ai-integration/prompt-composition/)** - How prompts are built
611
+ - **[Response Processing](./docs/core/ai-integration/response-processing/)** - Schema extraction & tool calls
612
+
613
+ ### 🔧 Tools & Data
614
+
615
+ - **[Tool Definition](./docs/core/tools/tool-definition.md)** - Creating and configuring tools
616
+ - **[Tool Execution](./docs/core/tools/tool-execution.md)** - Dynamic tool calling and context updates
617
+ - **[Tool Scoping](./docs/core/tools/tool-scoping.md)** - Agent, route, and step-level tool management
618
+
619
+ ### 💾 Persistence
620
+
621
+ - **[Session Storage](./docs/core/persistence/session-storage.md)** - Session persistence patterns
622
+ - **[Database Adapters](./docs/core/persistence/adapters.md)** - Built-in adapter configurations
623
+
624
+ ### 🚀 Advanced Guides
625
+
626
+ - **[Building Agents](./docs/guides/building-agents/)** - Complete agent construction patterns
627
+ - **[Advanced Patterns](./docs/guides/advanced-patterns/)** - Complex use cases & integrations
628
+ - **[API Reference](./docs/api/overview.md)** - Complete API documentation
629
+
630
+ ---
631
+
632
+ ## 🎯 Examples - By Domain
633
+
634
+ ### 🏗️ Core Concepts
635
+
636
+ Fundamental patterns every agent needs:
637
+
638
+ - **[Basic Agent](./examples/core-concepts/basic-agent.ts)** - Minimal agent setup and configuration
639
+ - **[Schema-Driven Extraction](./examples/core-concepts/schema-driven-extraction.ts)** - Type-safe data collection with JSON Schema
640
+ - **[Session Management](./examples/core-concepts/session-management.ts)** - Multi-turn conversations with persistence
641
+ - **[Context Providers](./examples/core-concepts/context-providers.ts)** - Dynamic context fetching and updates
642
+
643
+ ### 💬 Conversation Flows
644
+
645
+ Building intelligent dialogue systems:
646
+
647
+ - **[Simple Route](./examples/conversation-flows/simple-route.ts)** - Basic route with linear step progression
648
+ - **[Data-Driven Flows](./examples/conversation-flows/data-driven-flows.ts)** - Conditional logic with skipIf and requires
649
+ - **[Conditional Branching](./examples/conversation-flows/conditional-branching.ts)** - AI-powered branching decisions
650
+ - **[Completion Transitions](./examples/conversation-flows/completion-transitions.ts)** - Route transitions when flows complete
651
+
652
+ ### 🤖 AI Providers
653
+
654
+ Integrating different AI services:
655
+
656
+ - **[Gemini Integration](./examples/ai-providers/gemini-integration.ts)** - Google Gemini with advanced features
657
+ - **[OpenAI Integration](./examples/ai-providers/openai-integration.ts)** - GPT-4 and GPT-3.5 Turbo
658
+ - **[Anthropic Integration](./examples/ai-providers/anthropic-integration.ts)** - Claude with streaming and tool calling
659
+ - **[Custom Provider](./examples/ai-providers/custom-provider.ts)** - Build your own AI provider integration
660
+
661
+ ### 💾 Persistence
662
+
663
+ Session storage and data persistence:
664
+
665
+ - **[Memory Sessions](./examples/persistence/memory-sessions.ts)** - In-memory session management
666
+ - **[Redis Persistence](./examples/persistence/redis-persistence.ts)** - High-performance Redis storage
667
+ - **[Database Persistence](./examples/persistence/database-persistence.ts)** - SQL/NoSQL database integration
668
+ - **[Custom Adapter](./examples/persistence/custom-adapter.ts)** - Build custom persistence adapters
669
+
670
+ ### 🔧 Tools
671
+
672
+ Tool creation and data manipulation:
673
+
674
+ - **[Basic Tools](./examples/tools/basic-tools.ts)** - Simple tool creation and execution
675
+ - **[Data Enrichment Tools](./examples/tools/data-enrichment-tools.ts)** - Tools that modify collected data
676
+ - **[Context Updating Tools](./examples/tools/context-updating-tools.ts)** - Tools that modify agent context
677
+ - **[Domain Scoped Tools](./examples/tools/domain-scoped-tools.ts)** - Tool security and access control
678
+
679
+ ### 🚀 Advanced Patterns
680
+
681
+ Complex use cases and integrations:
682
+
683
+ - **[Multi-Turn Conversations](./examples/advanced-patterns/multi-turn-conversations.ts)** - Complex dialogue flows with backtracking
684
+ - **[Streaming Responses](./examples/advanced-patterns/streaming-responses.ts)** - Real-time response streaming
685
+ - **[Route Lifecycle Hooks](./examples/advanced-patterns/route-lifecycle-hooks.ts)** - Custom route behavior
686
+ - **[Custom Response Schemas](./examples/advanced-patterns/custom-response-schemas.ts)** - Advanced schema patterns
687
+
688
+ ### 🔗 Integrations
689
+
690
+ External service integrations:
691
+
692
+ - **[Server Deployment](./examples/integrations/server-deployment.ts)** - HTTP API with WebSocket streaming
693
+ - **[Database Integration](./examples/integrations/database-integration.ts)** - Direct database access patterns
694
+ - **[Webhook Integration](./examples/integrations/webhook-integration.ts)** - HTTP webhook handling
695
+ - **[API Integration](./examples/integrations/api-integration.ts)** - External API calls and responses
696
+
697
+ 📖 **[See all examples with detailed explanations →](./examples/)**
698
+
699
+ ---
700
+
701
+ ## 🏗️ How It Works
702
+
703
+ `@falai/agent` uses a **schema-first, pipeline-driven architecture** with intelligent pre-extraction:
704
+
705
+ ```
706
+ User Message + Session State
707
+
708
+ ┌─────────────────────────────────────────┐
709
+ │ 1. ROUTING + PRE-EXTRACTION │
710
+ │ • Evaluate routes (AI scoring) │
711
+ │ • Pre-extract data from message │
712
+ │ • Check route completion │
713
+ └─────────────────────────────────────────┘
714
+
715
+ ┌─────────────────────────────────────────┐
716
+ │ 2. SMART STEP SELECTION │
717
+ │ • Filter steps (skipIf, requires) │
718
+ │ • Skip steps with existing data │
719
+ │ • Select optimal next step │
720
+ └─────────────────────────────────────────┘
721
+
722
+ ┌─────────────────────────────────────────┐
723
+ │ 3. RESPONSE GENERATION │
724
+ │ • Build prompt with context │
725
+ │ • Generate AI response │
726
+ │ • Execute tools if needed │
727
+ └─────────────────────────────────────────┘
728
+
729
+ ┌─────────────────────────────────────────┐
730
+ │ 4. COMPLETION HANDLING │
731
+ │ • Auto-complete when data collected │
732
+ │ • Exclude completed routes │
733
+ │ • Generate completion message │
734
+ └─────────────────────────────────────────┘
735
+
736
+ Response + Updated Session State
737
+ ```
738
+
739
+ ### Key Principles:
740
+
741
+ ✅ **AI decides:** Route selection, data extraction, message generation, tool calling
742
+ ✅ **Code decides:** Step flow control, route completion, lifecycle hooks, data validation
743
+ ✅ **Result:** Efficient conversations that don't waste user time
744
+
745
+ ### What Makes It Smart:
746
+
747
+ 🎯 **Pre-Extraction** - Data extracted BEFORE entering steps (no repeated questions)
748
+ 🚀 **Auto-Completion** - Routes complete automatically when required fields are collected
749
+ 🔒 **Completion Protection** - Completed routes excluded from future selection
750
+ ⚡ **Smart Skipping** - Steps bypassed if their data is already present
751
+
752
+ 📖 **[Read the detailed architecture →](./docs/architecture/data-extraction-flow.md)**
753
+
754
+ ---
755
+
756
+ ## 🤝 Contributing
757
+
758
+ We welcome contributions! See our [Contributing Guide](./docs/CONTRIBUTING.md) for details on:
759
+
760
+ - 🐛 Reporting bugs
761
+ - 💡 Suggesting features
762
+ - 📝 Improving documentation
763
+ - 🔨 Submitting pull requests
764
+
765
+ ## 🎓 Inspired By
766
+
767
+ This framework draws inspiration from [**Parlant**](https://github.com/emcie-co/parlant) by Emcie Co., an excellent Python framework for conversational AI agents. We've adapted and enhanced these concepts for the TypeScript ecosystem with additional type safety and modern patterns.
768
+
769
+ ---
770
+
771
+ ## 📄 License
772
+
773
+ MIT © 2025
774
+
775
+ ---
776
+
777
+ <div align="center">
778
+
779
+ ## 🚀 Ready to Build?
780
+
781
+ **Choose your path:**
782
+
783
+ 👶 **New to AI agents?** → [Quick Start Guide](./docs/guides/getting-started/README.md)
784
+ 🏗️ **Building production app?** → [Agent Architecture](./docs/core/agent/README.md)
785
+ 💡 **Have questions?** → [Open a discussion](https://github.com/falai-dev/agent/discussions)
786
+
787
+ ---
788
+
789
+ ### ⭐ Star us on [GitHub](https://github.com/falai-dev/agent)
790
+
791
+ **Help us reach more developers building production AI!**
792
+
793
+ [Report Bug](https://github.com/falai-dev/agent/issues) • [Request Feature](https://github.com/falai-dev/agent/issues) • [Contribute](https://github.com/falai-dev/agent/pulls)
794
+
795
+ **Made with ❤️ for the community**
796
+
797
+ </div>