@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,902 @@
1
+ # Agent Architecture
2
+
3
+ ## Overview
4
+
5
+ The `Agent<TContext, TData>` class is the central orchestrator of @falai/agent, providing a strongly-typed, context-aware AI agent framework with intelligent routing and agent-level schema-driven data collection.
6
+
7
+ ## Core Responsibilities
8
+
9
+ - **AI Provider Management**: Unified interface to multiple AI providers (OpenAI, Gemini, Anthropic, etc.)
10
+ - **Intelligent Routing**: AI-powered route and step selection based on conversation context
11
+ - **Context Lifecycle**: Dynamic context management with provider functions and lifecycle hooks
12
+ - **Session Management**: Conversation state persistence and multi-turn dialogue support
13
+ - **Tool Orchestration**: Hierarchical tool execution (agent → route → step level)
14
+ - **Agent-Level Data Collection**: Centralized schema-driven information extraction shared across all routes
15
+
16
+ ## Agent Configuration
17
+
18
+ ### Basic Agent Setup
19
+
20
+ ```typescript
21
+ import { Agent, OpenAIProvider } from "@falai/agent";
22
+
23
+ const agent = new Agent({
24
+ name: "Customer Support Bot",
25
+ description: "AI assistant for customer inquiries",
26
+ provider: new OpenAIProvider({
27
+ apiKey: process.env.OPENAI_API_KEY,
28
+ model: "gpt-4",
29
+ }),
30
+ });
31
+ ```
32
+
33
+ ### Advanced Configuration
34
+
35
+ ```typescript
36
+ interface CustomerContext {
37
+ userId: string;
38
+ accountTier: "free" | "premium" | "enterprise";
39
+ lastLogin: Date;
40
+ preferences: {
41
+ language: string;
42
+ notifications: boolean;
43
+ };
44
+ }
45
+
46
+ interface CustomerData {
47
+ customerName?: string;
48
+ email?: string;
49
+ phone?: string;
50
+ issueType?: 'booking' | 'billing' | 'technical' | 'other';
51
+ issueDescription?: string;
52
+ priority?: 'low' | 'medium' | 'high';
53
+ rating?: number;
54
+ comments?: string;
55
+ }
56
+
57
+ const agent = new Agent<CustomerContext, CustomerData>({
58
+ // Identity
59
+ name: "Premium Support Assistant",
60
+ description: "24/7 AI support for premium customers",
61
+ goal: "Resolve customer issues efficiently while maintaining satisfaction",
62
+
63
+ // AI Provider with backup models
64
+ provider: new OpenAIProvider({
65
+ apiKey: process.env.OPENAI_API_KEY,
66
+ model: "gpt-5",
67
+ backupModels: ["gpt-4"],
68
+ }),
69
+
70
+ // Agent-level data schema (NEW)
71
+ schema: {
72
+ type: "object",
73
+ properties: {
74
+ customerName: { type: "string" },
75
+ email: { type: "string", format: "email" },
76
+ phone: { type: "string" },
77
+ issueType: { type: "string", enum: ["booking", "billing", "technical", "other"] },
78
+ issueDescription: { type: "string" },
79
+ priority: { type: "string", enum: ["low", "medium", "high"] },
80
+ rating: { type: "number", minimum: 1, maximum: 5 },
81
+ comments: { type: "string" }
82
+ }
83
+ },
84
+
85
+ // Static context (can be overridden by contextProvider)
86
+ context: {
87
+ userId: "anonymous",
88
+ accountTier: "free",
89
+ lastLogin: new Date(),
90
+ preferences: {
91
+ language: "en",
92
+ notifications: true,
93
+ },
94
+ },
95
+
96
+ // Dynamic context provider (takes precedence over static context)
97
+ contextProvider: async () => {
98
+ const user = await authenticateUser(request);
99
+ return {
100
+ userId: user.id,
101
+ accountTier: user.tier,
102
+ lastLogin: user.lastLogin,
103
+ preferences: user.preferences,
104
+ };
105
+ },
106
+
107
+ // Lifecycle hooks for context and data management
108
+ hooks: {
109
+ // Refresh context before each response
110
+ beforeRespond: async (currentContext) => {
111
+ const freshUser = await db.getUser(currentContext.userId);
112
+ return {
113
+ ...currentContext,
114
+ accountTier: freshUser.tier,
115
+ lastLogin: freshUser.lastLogin,
116
+ };
117
+ },
118
+
119
+ // Handle context updates from tools or responses
120
+ onContextUpdate: async (newContext, previousContext) => {
121
+ if (newContext.accountTier !== previousContext.accountTier) {
122
+ await auditLog.log({
123
+ type: "tier_change",
124
+ userId: newContext.userId,
125
+ from: previousContext.accountTier,
126
+ to: newContext.accountTier,
127
+ });
128
+ }
129
+ },
130
+
131
+ // Validate and enrich collected data (NEW: Agent-level data hooks)
132
+ onDataUpdate: async (data, previousData) => {
133
+ // Data validation against agent schema
134
+ if (data.email && !isValidEmail(data.email)) {
135
+ throw new Error("Invalid email format");
136
+ }
137
+
138
+ // Data enrichment using agent-level data
139
+ if (data.customerName && !data.customerId) {
140
+ data.customerId = await lookupCustomerId(data.customerName);
141
+ }
142
+
143
+ // Auto-set priority based on issue type
144
+ if (data.issueType === 'billing' && !data.priority) {
145
+ data.priority = 'high';
146
+ }
147
+
148
+ return data;
149
+ },
150
+ },
151
+
152
+ // Optional sessionId for automatic session loading/creation
153
+ sessionId: "user-123", // Agent will automatically load or create this session
154
+
155
+ // Optional persistence configuration
156
+ persistence: {
157
+ adapter: new RedisAdapter(redisClient),
158
+ autoSave: true, // Auto-save after each response
159
+ userId: "global", // Or dynamic based on context
160
+ },
161
+
162
+ // Domain knowledge
163
+ terms: [
164
+ {
165
+ name: "Premium Support",
166
+ description: "24/7 priority assistance with 1-hour response guarantee",
167
+ synonyms: ["priority support", "vip assistance"],
168
+ },
169
+ ],
170
+
171
+ // Enhanced behavioral guidelines with ConditionTemplate
172
+ guidelines: [
173
+ {
174
+ condition: [
175
+ "Customer seems frustrated or upset", // AI context
176
+ (ctx) => ctx.data?.priority === 'high' // Programmatic check
177
+ ],
178
+ action: "Apologize sincerely and offer to escalate to human agent",
179
+ enabled: true,
180
+ },
181
+ {
182
+ condition: (ctx) => ctx.accountTier === 'premium', // Function-only condition
183
+ action: "Provide expedited service and additional options",
184
+ enabled: true,
185
+ },
186
+ {
187
+ condition: "User is asking for help with billing", // String-only condition
188
+ action: "Be extra careful with financial information and offer phone support",
189
+ enabled: true,
190
+ },
191
+ ],
192
+
193
+ // Global tools available to all routes
194
+ tools: [searchTool, userLookupTool],
195
+
196
+ // Knowledge base for AI context
197
+ knowledgeBase: {
198
+ company: {
199
+ name: "Acme Corp",
200
+ supportHours: "24/7 for premium, 9-5 for free",
201
+ refundPolicy: "30 days for all purchases",
202
+ },
203
+ products: {
204
+ basic: {
205
+ price: "$9.99/month",
206
+ features: ["Email support", "5GB storage"],
207
+ },
208
+ premium: {
209
+ price: "$29.99/month",
210
+ features: ["24/7 support", "100GB storage", "Priority queue"],
211
+ },
212
+ },
213
+ },
214
+ });
215
+ ```
216
+
217
+ ## Context Management
218
+
219
+ ### Static Context
220
+
221
+ Fixed context available throughout the conversation:
222
+
223
+ ```typescript
224
+ const agent = new Agent({
225
+ context: {
226
+ companyName: "Acme Corp",
227
+ supportEmail: "support@acme.com",
228
+ currentDate: new Date().toISOString(),
229
+ },
230
+ });
231
+ ```
232
+
233
+ ### Dynamic Context Provider
234
+
235
+ Fresh context fetched before each response:
236
+
237
+ ```typescript
238
+ const agent = new Agent({
239
+ contextProvider: async () => {
240
+ // Fetch real-time data
241
+ const weather = await weatherAPI.getCurrentWeather();
242
+ const user = await auth.getCurrentUser();
243
+
244
+ return {
245
+ currentWeather: weather,
246
+ userProfile: user,
247
+ serverTime: new Date(),
248
+ };
249
+ },
250
+ });
251
+ ```
252
+
253
+ ### Context Updates
254
+
255
+ Context can be modified during conversation:
256
+
257
+ ```typescript
258
+ // From tool execution
259
+ const updateLocationTool: Tool<
260
+ { currentLocation?: string; lastLocationUpdate?: Date },
261
+ [],
262
+ string,
263
+ { location: string }
264
+ > = {
265
+ id: "update_location",
266
+ description: "Update user's current location",
267
+ parameters: {
268
+ type: "object",
269
+ properties: {
270
+ location: { type: "string", description: "New location to set" },
271
+ },
272
+ required: ["location"],
273
+ },
274
+ handler: async ({ context }, { location }) => {
275
+ return {
276
+ data: `Location updated to ${location}`,
277
+ contextUpdate: {
278
+ currentLocation: location,
279
+ lastLocationUpdate: new Date(),
280
+ },
281
+ };
282
+ },
283
+ };
284
+
285
+ // Programmatically
286
+ await agent.updateContext({
287
+ userStatus: "premium",
288
+ lastActivity: new Date(),
289
+ });
290
+ ```
291
+
292
+ ## Session Management
293
+
294
+ ### Automatic Session Management
295
+
296
+ Sessions are automatically managed through the integrated `SessionManager`:
297
+
298
+ ```typescript
299
+ // Agent with automatic session management
300
+ const agent = new Agent({
301
+ name: "Assistant",
302
+ provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
303
+ persistence: { adapter: new PrismaAdapter({ prisma }) },
304
+ sessionId: "user-123" // Automatically loads or creates this session
305
+ });
306
+
307
+ // Access session manager
308
+ const sessionManager = agent.session;
309
+
310
+ // Get or create session (handles existing, new, or auto-generated IDs)
311
+ await sessionManager.getOrCreate("user-456");
312
+ await sessionManager.getOrCreate(); // Auto-generates ID
313
+
314
+ // Session data access
315
+ const data = sessionManager.getData<MyDataType>();
316
+ await sessionManager.setData({ field: "value" });
317
+
318
+ // History management
319
+ await sessionManager.addMessage("user", "Hello");
320
+ const history = sessionManager.getHistory();
321
+ sessionManager.clearHistory();
322
+ ```
323
+
324
+ ### Session Persistence
325
+
326
+ Sessions are automatically persisted when using persistence adapters:
327
+
328
+ ```typescript
329
+ const agent = new Agent({
330
+ persistence: {
331
+ adapter: new RedisAdapter(redisClient),
332
+ autoSave: true, // Auto-save after each response (default)
333
+ },
334
+ sessionId: "user-123" // Automatically loads from persistence
335
+ });
336
+
337
+ // Sessions are automatically saved after each message
338
+ const response = await agent.respond("Hello");
339
+ // Session state automatically persisted
340
+
341
+ // Manual session operations (if needed)
342
+ await agent.session.save(); // Manual save
343
+ await agent.session.delete(); // Delete session
344
+ const newSession = await agent.session.reset(true); // Reset with history preserved
345
+ ```
346
+
347
+ ### Session Access Methods
348
+
349
+ ```typescript
350
+ // Access current session data
351
+ const data = agent.session.getData<MyDataType>();
352
+ await agent.session.setData({ field: "value" });
353
+
354
+ // Session information
355
+ console.log(agent.session.id); // Current session ID
356
+ console.log(agent.session.current); // Full session state
357
+
358
+ // History management
359
+ const history = agent.session.getHistory();
360
+ await agent.session.addMessage("user", "New message");
361
+ agent.session.clearHistory();
362
+ ```
363
+
364
+ ## Route Management
365
+
366
+ ### Declarative Route Creation
367
+
368
+ ```typescript
369
+ const agent = new Agent<CustomerContext, CustomerData>({
370
+ // Agent-level schema defines all possible data fields
371
+ schema: { /* comprehensive schema */ },
372
+
373
+ routes: [
374
+ {
375
+ title: "Technical Support",
376
+ description: "Help with technical issues",
377
+ when: ["user reports technical problem"],
378
+ // NEW: Routes specify required fields instead of schemas
379
+ requiredFields: ["customerName", "email", "issueType", "issueDescription"],
380
+ optionalFields: ["phone", "priority"],
381
+ initialStep: {
382
+ prompt:
383
+ "I understand you're having a technical issue. Can you describe what's happening?",
384
+ collect: ["issueType", "issueDescription"], // Collects into agent-level data
385
+ },
386
+ },
387
+ {
388
+ title: "Billing Inquiry",
389
+ description: "Handle billing and payment questions",
390
+ when: ["user asks about billing or payment"],
391
+ requiredFields: ["customerName", "email", "issueType"],
392
+ initialStep: {
393
+ prompt:
394
+ "I'd be happy to help with your billing question. What can I assist with?",
395
+ collect: ["issueType"], // Maps to agent schema field
396
+ },
397
+ },
398
+ ],
399
+ });
400
+ ```
401
+
402
+ ### Programmatic Route Creation
403
+
404
+ ```typescript
405
+ // Create routes dynamically with required fields
406
+ const supportRoute = agent
407
+ .createRoute({
408
+ title: "Customer Support",
409
+ requiredFields: ["customerName", "email", "issueType"], // NEW: Required fields
410
+ optionalFields: ["phone"], // NEW: Optional fields
411
+ initialStep: {
412
+ prompt: "How can I help you today?",
413
+ collect: ["customerName", "email"], // Collects into agent-level data
414
+ },
415
+ })
416
+ .nextStep({
417
+ prompt: "I understand you need help, {{customerName}}. What type of issue are you experiencing?",
418
+ collect: ["issueType"],
419
+ requires: ["customerName", "email"], // Prerequisites from agent data
420
+ });
421
+
422
+ // Access created routes
423
+ const routes = agent.getRoutes();
424
+ console.log(routes.map((r) => r.title)); // ["Customer Support", ...]
425
+ ```
426
+
427
+ ## Enhanced Guideline System
428
+
429
+ ### Flexible Guideline Conditions
430
+
431
+ Guidelines now support the powerful `ConditionTemplate` system, allowing for more sophisticated behavioral control:
432
+
433
+ ```typescript
434
+ // String-only condition (AI context)
435
+ agent.addGuideline({
436
+ condition: "User is asking for technical help",
437
+ action: "Provide detailed technical explanations with examples"
438
+ });
439
+
440
+ // Function-only condition (programmatic)
441
+ agent.addGuideline({
442
+ condition: (ctx) => ctx.data?.userType === 'premium',
443
+ action: "Offer priority support and additional features"
444
+ });
445
+
446
+ // Mixed array condition (hybrid approach)
447
+ agent.addGuideline({
448
+ condition: [
449
+ "User seems confused or needs clarification", // AI context
450
+ (ctx) => ctx.data?.attemptCount > 2 // Programmatic check
451
+ ],
452
+ action: "Slow down, use simpler language, and offer to connect with human support"
453
+ });
454
+
455
+ // Complex conditional guidelines
456
+ agent.addGuideline({
457
+ condition: [
458
+ "User is reporting a critical issue", // AI context
459
+ (ctx) => ctx.data?.accountTier === 'enterprise', // Account check
460
+ (ctx) => new Date().getHours() >= 9 && new Date().getHours() <= 17 // Business hours
461
+ ],
462
+ action: "Immediately escalate to senior technical support and provide direct contact information"
463
+ });
464
+ ```
465
+
466
+ ### Guideline Evaluation Logic
467
+
468
+ Guidelines use **AND logic** for arrays - all conditions must be met:
469
+
470
+ - **String conditions**: Provide context to AI for guideline matching
471
+ - **Function conditions**: Must return `true` for guideline to activate
472
+ - **Arrays**: All functions must return `true`, strings provide AI context
473
+
474
+ ### Context-Aware Guidelines
475
+
476
+ Guidelines can access both agent context and collected data:
477
+
478
+ ```typescript
479
+ interface SupportContext {
480
+ userTier: 'free' | 'premium' | 'enterprise';
481
+ supportTicketCount: number;
482
+ lastContactDate?: Date;
483
+ }
484
+
485
+ interface SupportData {
486
+ issueType?: string;
487
+ severity?: 'low' | 'medium' | 'high' | 'critical';
488
+ previousAttempts?: number;
489
+ }
490
+
491
+ agent.addGuideline({
492
+ condition: [
493
+ "User has contacted support multiple times recently", // AI context
494
+ (ctx) => ctx.context?.supportTicketCount > 3, // Context check
495
+ (ctx) => ctx.data?.severity === 'high' // Data check
496
+ ],
497
+ action: "Acknowledge their patience, apologize for the inconvenience, and prioritize their case"
498
+ });
499
+ ```
500
+
501
+ ### Dynamic Guideline Activation
502
+
503
+ Guidelines can be activated based on conversation state:
504
+
505
+ ```typescript
506
+ // Time-based guidelines
507
+ agent.addGuideline({
508
+ condition: (ctx) => {
509
+ const hour = new Date().getHours();
510
+ return hour < 9 || hour > 17; // Outside business hours
511
+ },
512
+ action: "Inform user that live support is available during business hours (9 AM - 5 PM)"
513
+ });
514
+
515
+ // Progress-based guidelines
516
+ agent.addGuideline({
517
+ condition: [
518
+ "User is making good progress", // AI context
519
+ (ctx) => Object.keys(ctx.data || {}).length > 3 // Has collected significant data
520
+ ],
521
+ action: "Acknowledge their cooperation and let them know we're almost done"
522
+ });
523
+
524
+ // Route-specific guidelines
525
+ agent.addGuideline({
526
+ condition: [
527
+ "User is in the payment process", // AI context
528
+ (ctx) => ctx.session?.currentRoute?.id === 'payment_flow' // Route check
529
+ ],
530
+ action: "Be extra careful with payment information and confirm all details before processing"
531
+ });
532
+ ```
533
+
534
+ ## Tool Integration
535
+
536
+ ### Agent-Level Tools
537
+
538
+ Available to all routes and steps:
539
+
540
+ ```typescript
541
+ const agent = new Agent({
542
+ tools: [searchTool, calculatorTool, translationTool],
543
+ });
544
+ ```
545
+
546
+ ### Route-Level Tools
547
+
548
+ Specific to a route:
549
+
550
+ ```typescript
551
+ const route = agent.createRoute({
552
+ title: "Order Management",
553
+ tools: [orderLookupTool, orderUpdateTool, refundTool],
554
+ });
555
+ ```
556
+
557
+ ### Tool Resolution Priority
558
+
559
+ 1. **Step-level tools** (highest priority)
560
+ 2. **Route-level tools**
561
+ 3. **Agent-level tools** (lowest priority)
562
+
563
+ ## Agent-Level Data Collection
564
+
565
+ ### Centralized Data Schema
566
+
567
+ The new architecture centralizes data collection at the agent level, allowing all routes to work with the same data structure:
568
+
569
+ ```typescript
570
+ interface ComprehensiveData {
571
+ // Customer identification
572
+ customerId?: string;
573
+ customerName?: string;
574
+ email?: string;
575
+ phone?: string;
576
+
577
+ // Issue tracking
578
+ issueType?: 'booking' | 'billing' | 'technical' | 'other';
579
+ issueDescription?: string;
580
+ priority?: 'low' | 'medium' | 'high';
581
+
582
+ // Feedback
583
+ rating?: number;
584
+ comments?: string;
585
+ recommendToFriend?: boolean;
586
+ }
587
+
588
+ const agent = new Agent<Context, ComprehensiveData>({
589
+ name: "Customer Service Agent",
590
+ schema: {
591
+ type: "object",
592
+ properties: {
593
+ customerId: { type: "string" },
594
+ customerName: { type: "string" },
595
+ email: { type: "string", format: "email" },
596
+ phone: { type: "string" },
597
+ issueType: { type: "string", enum: ["booking", "billing", "technical", "other"] },
598
+ issueDescription: { type: "string" },
599
+ priority: { type: "string", enum: ["low", "medium", "high"] },
600
+ rating: { type: "number", minimum: 1, maximum: 5 },
601
+ comments: { type: "string" },
602
+ recommendToFriend: { type: "boolean" }
603
+ }
604
+ }
605
+ });
606
+ ```
607
+
608
+ ### Route Completion Based on Required Fields
609
+
610
+ Routes now specify which fields they need to complete, enabling cross-route data sharing:
611
+
612
+ ```typescript
613
+ // Support route needs basic info + issue details
614
+ const supportRoute = agent.createRoute({
615
+ title: "Customer Support",
616
+ requiredFields: ["customerName", "email", "issueType", "issueDescription"],
617
+ optionalFields: ["phone", "priority"]
618
+ });
619
+
620
+ // Feedback route needs basic info + rating
621
+ const feedbackRoute = agent.createRoute({
622
+ title: "Feedback Collection",
623
+ requiredFields: ["customerName", "email", "rating"],
624
+ optionalFields: ["comments", "recommendToFriend"]
625
+ });
626
+
627
+ // Routes can complete when their required data is available,
628
+ // regardless of which route collected it
629
+ ```
630
+
631
+ ### Cross-Route Data Sharing
632
+
633
+ Data collected by any route is available to all other routes:
634
+
635
+ ```typescript
636
+ // User starts with support, provides name and email
637
+ const response1 = await agent.respond("I need help, my name is John Doe, email john@example.com");
638
+ // Agent data now contains: { customerName: "John Doe", email: "john@example.com" }
639
+
640
+ // User switches to feedback - already has 2/3 required fields
641
+ const response2 = await agent.respond("Actually, I want to leave feedback. I'd rate you 5 stars.");
642
+ // Feedback route completes immediately with: { customerName: "John Doe", email: "john@example.com", rating: 5 }
643
+ ```
644
+
645
+ ### Agent Data Management Methods
646
+
647
+ Access and update agent-level data programmatically:
648
+
649
+ ```typescript
650
+ // Get current collected data
651
+ const currentData = agent.getCollectedData();
652
+ console.log(currentData); // { customerName: "John", email: "john@example.com" }
653
+
654
+ // Update data programmatically
655
+ await agent.updateCollectedData({
656
+ customerId: "CUST-12345",
657
+ priority: "high"
658
+ });
659
+
660
+ // Validate data against schema
661
+ const validation = agent.validateData({ email: "invalid-email" });
662
+ if (!validation.valid) {
663
+ console.log(validation.errors); // Detailed validation errors
664
+ }
665
+ ```
666
+
667
+ ## Response Generation
668
+
669
+ ### Simple Response API
670
+
671
+ ```typescript
672
+ // Simple message-based API (recommended)
673
+ const response = await agent.respond("How do I reset my password?");
674
+ console.log(response.message);
675
+ console.log(agent.session.getData<CustomerData>()); // Agent-level collected data
676
+ console.log(response.toolCalls); // Any tool calls made
677
+ console.log(response.isRouteComplete); // Whether route finished
678
+
679
+ // Advanced usage with history override
680
+ const response = await agent.respond("Hello", {
681
+ history: [
682
+ { role: "user", content: "Previous context" },
683
+ { role: "assistant", content: "I understand" }
684
+ ]
685
+ });
686
+ ```
687
+
688
+ ### Streaming Response
689
+
690
+ ```typescript
691
+ const stream = agent.respondStream("Tell me about your services");
692
+
693
+ for await (const chunk of stream) {
694
+ if (chunk.delta) {
695
+ process.stdout.write(chunk.delta); // Real-time output
696
+ }
697
+
698
+ if (chunk.done) {
699
+ console.log("\nSession ID:", agent.session.id);
700
+ console.log("Tool calls:", chunk.toolCalls);
701
+ }
702
+ }
703
+ ```
704
+
705
+ ### Response with Custom Context
706
+
707
+ ```typescript
708
+ const response = await agent.respond("Hola", {
709
+ contextOverride: {
710
+ language: "es", // Override context for this response
711
+ debug: true,
712
+ }
713
+ });
714
+ ```
715
+
716
+ ## Advanced Features
717
+
718
+ ### Route Transitions
719
+
720
+ ```typescript
721
+ // Manual route transition
722
+ await agent.nextStepRoute("premium-support", session);
723
+
724
+ // Route completion transitions
725
+ const supportRoute = agent.createRoute({
726
+ title: "Basic Support",
727
+ onComplete: "feedback-survey", // Auto-transition when complete
728
+ });
729
+
730
+ // Dynamic transitions
731
+ const dynamicRoute = agent.createRoute({
732
+ title: "Workflow",
733
+ onComplete: async (session, context) => {
734
+ if (session.data.success) {
735
+ return "success-route";
736
+ }
737
+ return "retry-route";
738
+ },
739
+ });
740
+ ```
741
+
742
+ ### Debugging
743
+
744
+ ```typescript
745
+ const debugAgent = new Agent({
746
+ name: "Debug Agent",
747
+ debug: true, // Enables detailed logging
748
+ provider: openaiProvider,
749
+ });
750
+
751
+ // Logs will show:
752
+ // [Agent] Selected route: Technical Support
753
+ // [Agent] Entered step: initial_step
754
+ // [Agent] Tool executed: search_kb (success: true)
755
+ // [RoutingEngine] AI selected step: detailed_help
756
+ ```
757
+
758
+ ## Agent and Route Option Merging
759
+
760
+ @fai/agent supports hierarchical configuration where route-level options can override or merge with agent-level options. Understanding this behavior is crucial for effective agent design.
761
+
762
+ ### Guidelines and Terms
763
+
764
+ **Guidelines** are combined from both agent and route levels:
765
+
766
+ - Agent-level guidelines are applied first
767
+ - Route-level guidelines are added after agent guidelines
768
+ - All guidelines are evaluated together during response generation
769
+
770
+ ```typescript
771
+ const agent = new Agent({
772
+ guidelines: [
773
+ { id: "polite", action: "Always be polite and professional" },
774
+ { id: "accurate", action: "Provide accurate information" },
775
+ ],
776
+ });
777
+
778
+ const route = agent.createRoute({
779
+ guidelines: [
780
+ {
781
+ id: "domain_specific",
782
+ action: "Use technical terminology appropriately",
783
+ },
784
+ ],
785
+ });
786
+ // Result: All 3 guidelines (polite, accurate, domain_specific) are used
787
+ ```
788
+
789
+ **Terms** use route-level precedence:
790
+
791
+ - Agent-level terms are loaded first
792
+ - Route-level terms with the same name override agent-level terms
793
+ - This allows routes to provide domain-specific definitions
794
+
795
+ ```typescript
796
+ const agent = new Agent({
797
+ terms: [{ name: "API", description: "Application Programming Interface" }],
798
+ });
799
+
800
+ const route = agent.createRoute({
801
+ terms: [
802
+ {
803
+ name: "API",
804
+ description: "In this context, API refers to our REST API endpoints",
805
+ },
806
+ ],
807
+ });
808
+ // Result: Route's definition of "API" takes precedence
809
+ ```
810
+
811
+ ### Tools
812
+
813
+ **Tools** follow a hierarchical priority system:
814
+
815
+ 1. Step-level tools (highest priority)
816
+ 2. Route-level tools
817
+ 3. Agent-level tools (lowest priority)
818
+
819
+ Tools with the same ID at different levels will be resolved by priority, with higher-level tools taking precedence.
820
+
821
+ ### Lifecycle Hooks
822
+
823
+ **Lifecycle hooks** are called at both agent and route levels:
824
+
825
+ - Agent-level hooks are called for all routes
826
+ - Route-level hooks are called only for that specific route
827
+ - Both types of hooks can modify context and data
828
+
829
+ ## Best Practices
830
+
831
+ ### Context Design
832
+
833
+ - **Keep context focused**: Only include data needed across conversations
834
+ - **Use providers for freshness**: Prefer `contextProvider` over static context for dynamic data
835
+ - **Handle updates gracefully**: Use lifecycle hooks for validation and side effects
836
+
837
+ ### Session Management
838
+
839
+ - **Set up persistence early**: Configure persistence for production use
840
+ - **Use meaningful session IDs**: Include user/context identifiers
841
+ - **Clean up old sessions**: Implement retention policies
842
+
843
+ ### Route Organization
844
+
845
+ - **Single responsibility**: Each route should serve one clear user intent
846
+ - **Progressive disclosure**: Collect information in logical order
847
+ - **Clear completion criteria**: Define when routes should end
848
+
849
+ ### Tool Management
850
+
851
+ - **Hierarchical scoping**: Use appropriate tool levels for security and performance
852
+ - **Error handling**: Implement robust error recovery in tools
853
+ - **Performance monitoring**: Track tool usage and response times
854
+
855
+ ### Performance Optimization
856
+
857
+ - **Limit concurrent sessions**: Implement session limits for high-traffic scenarios
858
+ - **Cache context data**: Avoid redundant API calls in context providers
859
+ - **Batch operations**: Group related tool calls when possible
860
+
861
+ ## Migration from Legacy Agents
862
+
863
+ ### From Domain-Based to Route-Based
864
+
865
+ ```typescript
866
+ // Legacy (domain-based)
867
+ const legacyAgent = new Agent({
868
+ domains: ["calendar", "email"],
869
+ });
870
+
871
+ // New (route-based)
872
+ const newAgent = new Agent({
873
+ routes: [
874
+ {
875
+ title: "Calendar Management",
876
+ tools: [calendarTool], // Route-specific tools
877
+ },
878
+ {
879
+ title: "Email Management",
880
+ tools: [emailTool],
881
+ },
882
+ ],
883
+ });
884
+ ```
885
+
886
+ ### From Static to Dynamic Context
887
+
888
+ ```typescript
889
+ // Legacy (static context)
890
+ const staticAgent = new Agent({
891
+ context: { userId: "123" },
892
+ });
893
+
894
+ // New (dynamic context)
895
+ const dynamicAgent = new Agent({
896
+ contextProvider: async () => {
897
+ return { userId: await auth.getCurrentUserId() };
898
+ },
899
+ });
900
+ ```
901
+
902
+ The Agent class provides a comprehensive foundation for building intelligent, context-aware AI applications with robust conversation management and data collection capabilities.