@falai/agent 0.8.0 → 0.9.0-alpha-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (654) hide show
  1. package/README.md +306 -133
  2. package/dist/{adapters → cjs/src/adapters}/MemoryAdapter.d.ts +4 -4
  3. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
  4. package/dist/cjs/{adapters → src/adapters}/MemoryAdapter.js +41 -21
  5. package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
  6. package/dist/{adapters → cjs/src/adapters}/MongoAdapter.d.ts +3 -3
  7. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
  8. package/dist/cjs/{adapters → src/adapters}/MongoAdapter.js +2 -1
  9. package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
  10. package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
  11. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  12. package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
  13. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
  14. package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
  15. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  16. package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
  17. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
  18. package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
  19. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
  20. package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.js +35 -5
  21. package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
  22. package/dist/cjs/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
  23. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
  24. package/dist/cjs/{adapters → src/adapters}/RedisAdapter.js +3 -2
  25. package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
  26. package/dist/{adapters → cjs/src/adapters}/SQLiteAdapter.d.ts +3 -3
  27. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  28. package/dist/cjs/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
  29. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
  30. package/dist/cjs/src/adapters/index.d.ts.map +1 -0
  31. package/dist/cjs/src/adapters/index.js.map +1 -0
  32. package/dist/cjs/src/constants/index.d.ts.map +1 -0
  33. package/dist/cjs/src/constants/index.js.map +1 -0
  34. package/dist/{core → cjs/src/core}/Agent.d.ts +67 -69
  35. package/dist/cjs/src/core/Agent.d.ts.map +1 -0
  36. package/dist/cjs/src/core/Agent.js +1433 -0
  37. package/dist/cjs/src/core/Agent.js.map +1 -0
  38. package/dist/cjs/src/core/Events.d.ts +26 -0
  39. package/dist/cjs/src/core/Events.d.ts.map +1 -0
  40. package/dist/cjs/src/core/Events.js +144 -0
  41. package/dist/cjs/src/core/Events.js.map +1 -0
  42. package/dist/cjs/src/core/PersistenceManager.d.ts +98 -0
  43. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  44. package/dist/cjs/{core → src/core}/PersistenceManager.js +62 -32
  45. package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
  46. package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
  47. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
  48. package/dist/cjs/src/core/PromptComposer.js +157 -0
  49. package/dist/cjs/src/core/PromptComposer.js.map +1 -0
  50. package/dist/cjs/src/core/ResponseEngine.d.ts +31 -0
  51. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
  52. package/dist/cjs/src/core/ResponseEngine.js +84 -0
  53. package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
  54. package/dist/cjs/src/core/ResponsePipeline.d.ts +143 -0
  55. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
  56. package/dist/cjs/src/core/ResponsePipeline.js +446 -0
  57. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
  58. package/dist/cjs/src/core/Route.d.ts +126 -0
  59. package/dist/cjs/src/core/Route.d.ts.map +1 -0
  60. package/dist/cjs/{core → src/core}/Route.js +116 -20
  61. package/dist/cjs/src/core/Route.js.map +1 -0
  62. package/dist/{core → cjs/src/core}/RoutingEngine.d.ts +33 -38
  63. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
  64. package/dist/cjs/{core → src/core}/RoutingEngine.js +102 -108
  65. package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
  66. package/dist/cjs/src/core/SessionManager.d.ts +76 -0
  67. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
  68. package/dist/cjs/src/core/SessionManager.js +197 -0
  69. package/dist/cjs/src/core/SessionManager.js.map +1 -0
  70. package/dist/cjs/src/core/Step.d.ts +96 -0
  71. package/dist/cjs/src/core/Step.d.ts.map +1 -0
  72. package/dist/cjs/src/core/Step.js +206 -0
  73. package/dist/cjs/src/core/Step.js.map +1 -0
  74. package/dist/cjs/src/core/ToolExecutor.d.ts +43 -0
  75. package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
  76. package/dist/cjs/{core → src/core}/ToolExecutor.js +19 -18
  77. package/dist/cjs/src/core/ToolExecutor.js.map +1 -0
  78. package/dist/{index.d.ts → cjs/src/index.d.ts} +7 -15
  79. package/dist/cjs/src/index.d.ts.map +1 -0
  80. package/dist/cjs/{index.js → src/index.js} +21 -19
  81. package/dist/cjs/src/index.js.map +1 -0
  82. package/dist/cjs/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
  83. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
  84. package/dist/cjs/{providers → src/providers}/AnthropicProvider.js +54 -2
  85. package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
  86. package/dist/{providers → cjs/src/providers}/GeminiProvider.d.ts +1 -1
  87. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
  88. package/dist/cjs/{providers → src/providers}/GeminiProvider.js +65 -0
  89. package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
  90. package/dist/cjs/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
  91. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
  92. package/dist/cjs/{providers → src/providers}/OpenAIProvider.js +70 -1
  93. package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
  94. package/dist/{providers → cjs/src/providers}/OpenRouterProvider.d.ts +1 -1
  95. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
  96. package/dist/cjs/{providers → src/providers}/OpenRouterProvider.js +76 -0
  97. package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
  98. package/dist/cjs/src/providers/index.d.ts.map +1 -0
  99. package/dist/cjs/src/providers/index.js.map +1 -0
  100. package/dist/cjs/{types → src/types}/agent.d.ts +54 -35
  101. package/dist/cjs/src/types/agent.d.ts.map +1 -0
  102. package/dist/cjs/src/types/agent.js.map +1 -0
  103. package/dist/cjs/{types → src/types}/ai.d.ts +7 -0
  104. package/dist/cjs/src/types/ai.d.ts.map +1 -0
  105. package/dist/cjs/src/types/ai.js.map +1 -0
  106. package/dist/{types → cjs/src/types}/history.d.ts +76 -18
  107. package/dist/cjs/src/types/history.d.ts.map +1 -0
  108. package/dist/cjs/src/types/history.js +33 -0
  109. package/dist/cjs/src/types/history.js.map +1 -0
  110. package/dist/cjs/src/types/index.d.ts +20 -0
  111. package/dist/cjs/src/types/index.d.ts.map +1 -0
  112. package/dist/cjs/src/types/index.js +30 -0
  113. package/dist/cjs/src/types/index.js.map +1 -0
  114. package/dist/{types → cjs/src/types}/persistence.d.ts +39 -23
  115. package/dist/cjs/src/types/persistence.d.ts.map +1 -0
  116. package/dist/cjs/src/types/persistence.js.map +1 -0
  117. package/dist/cjs/{types → src/types}/route.d.ts +85 -31
  118. package/dist/cjs/src/types/route.d.ts.map +1 -0
  119. package/dist/cjs/{types → src/types}/route.js.map +1 -1
  120. package/dist/cjs/src/types/routing.d.ts.map +1 -0
  121. package/dist/{types → cjs/src/types}/routing.js.map +1 -1
  122. package/dist/cjs/src/types/schema.d.ts.map +1 -0
  123. package/dist/{types → cjs/src/types}/schema.js.map +1 -1
  124. package/dist/cjs/src/types/session.d.ts +70 -0
  125. package/dist/cjs/src/types/session.d.ts.map +1 -0
  126. package/dist/cjs/src/types/session.js +6 -0
  127. package/dist/cjs/src/types/session.js.map +1 -0
  128. package/dist/cjs/src/types/template.d.ts +30 -0
  129. package/dist/cjs/src/types/template.d.ts.map +1 -0
  130. package/dist/cjs/src/types/template.js +3 -0
  131. package/dist/cjs/src/types/template.js.map +1 -0
  132. package/dist/cjs/{types → src/types}/tool.d.ts +6 -8
  133. package/dist/cjs/src/types/tool.d.ts.map +1 -0
  134. package/dist/cjs/{types → src/types}/tool.js.map +1 -1
  135. package/dist/cjs/src/utils/clone.d.ts +8 -0
  136. package/dist/cjs/src/utils/clone.d.ts.map +1 -0
  137. package/dist/cjs/src/utils/clone.js +36 -0
  138. package/dist/cjs/src/utils/clone.js.map +1 -0
  139. package/dist/{utils → cjs/src/utils}/event.d.ts +1 -1
  140. package/dist/cjs/src/utils/event.d.ts.map +1 -0
  141. package/dist/cjs/{utils → src/utils}/event.js +2 -2
  142. package/dist/cjs/src/utils/event.js.map +1 -0
  143. package/dist/cjs/src/utils/history.d.ts +31 -0
  144. package/dist/cjs/src/utils/history.d.ts.map +1 -0
  145. package/dist/cjs/src/utils/history.js +128 -0
  146. package/dist/cjs/src/utils/history.js.map +1 -0
  147. package/dist/cjs/src/utils/id.d.ts.map +1 -0
  148. package/dist/cjs/src/utils/id.js.map +1 -0
  149. package/dist/cjs/src/utils/index.d.ts +13 -0
  150. package/dist/cjs/src/utils/index.d.ts.map +1 -0
  151. package/dist/cjs/src/utils/index.js +49 -0
  152. package/dist/cjs/src/utils/index.js.map +1 -0
  153. package/dist/cjs/src/utils/logger.d.ts.map +1 -0
  154. package/dist/cjs/src/utils/logger.js.map +1 -0
  155. package/dist/cjs/src/utils/retry.d.ts.map +1 -0
  156. package/dist/cjs/src/utils/retry.js.map +1 -0
  157. package/dist/cjs/src/utils/session.d.ts +51 -0
  158. package/dist/cjs/src/utils/session.d.ts.map +1 -0
  159. package/dist/cjs/{types → src/utils}/session.js +36 -13
  160. package/dist/cjs/src/utils/session.js.map +1 -0
  161. package/dist/cjs/src/utils/template.d.ts +107 -0
  162. package/dist/cjs/src/utils/template.d.ts.map +1 -0
  163. package/dist/cjs/src/utils/template.js +283 -0
  164. package/dist/cjs/src/utils/template.js.map +1 -0
  165. package/dist/{cjs → src}/adapters/MemoryAdapter.d.ts +4 -4
  166. package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
  167. package/dist/{adapters → src/adapters}/MemoryAdapter.js +41 -21
  168. package/dist/src/adapters/MemoryAdapter.js.map +1 -0
  169. package/dist/{cjs → src}/adapters/MongoAdapter.d.ts +3 -3
  170. package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
  171. package/dist/{adapters → src/adapters}/MongoAdapter.js +2 -1
  172. package/dist/src/adapters/MongoAdapter.js.map +1 -0
  173. package/dist/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
  174. package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  175. package/dist/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
  176. package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
  177. package/dist/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
  178. package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  179. package/dist/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
  180. package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
  181. package/dist/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
  182. package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
  183. package/dist/{adapters → src/adapters}/PrismaAdapter.js +35 -5
  184. package/dist/src/adapters/PrismaAdapter.js.map +1 -0
  185. package/dist/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
  186. package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
  187. package/dist/{adapters → src/adapters}/RedisAdapter.js +3 -2
  188. package/dist/src/adapters/RedisAdapter.js.map +1 -0
  189. package/dist/{cjs → src}/adapters/SQLiteAdapter.d.ts +3 -3
  190. package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  191. package/dist/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
  192. package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
  193. package/dist/src/adapters/index.js.map +1 -0
  194. package/dist/src/constants/index.js.map +1 -0
  195. package/dist/{cjs → src}/core/Agent.d.ts +67 -69
  196. package/dist/src/core/Agent.d.ts.map +1 -0
  197. package/dist/src/core/Agent.js +1429 -0
  198. package/dist/src/core/Agent.js.map +1 -0
  199. package/dist/src/core/Events.d.ts +26 -0
  200. package/dist/src/core/Events.d.ts.map +1 -0
  201. package/dist/src/core/Events.js +137 -0
  202. package/dist/src/core/Events.js.map +1 -0
  203. package/dist/src/core/PersistenceManager.d.ts +98 -0
  204. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  205. package/dist/{core → src/core}/PersistenceManager.js +56 -26
  206. package/dist/src/core/PersistenceManager.js.map +1 -0
  207. package/dist/src/core/PromptComposer.d.ts +27 -0
  208. package/dist/src/core/PromptComposer.d.ts.map +1 -0
  209. package/dist/src/core/PromptComposer.js +153 -0
  210. package/dist/src/core/PromptComposer.js.map +1 -0
  211. package/dist/src/core/ResponseEngine.d.ts +31 -0
  212. package/dist/src/core/ResponseEngine.d.ts.map +1 -0
  213. package/dist/src/core/ResponseEngine.js +80 -0
  214. package/dist/src/core/ResponseEngine.js.map +1 -0
  215. package/dist/src/core/ResponsePipeline.d.ts +143 -0
  216. package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
  217. package/dist/src/core/ResponsePipeline.js +442 -0
  218. package/dist/src/core/ResponsePipeline.js.map +1 -0
  219. package/dist/src/core/Route.d.ts +126 -0
  220. package/dist/src/core/Route.d.ts.map +1 -0
  221. package/dist/{core → src/core}/Route.js +116 -20
  222. package/dist/src/core/Route.js.map +1 -0
  223. package/dist/{cjs → src}/core/RoutingEngine.d.ts +33 -38
  224. package/dist/src/core/RoutingEngine.d.ts.map +1 -0
  225. package/dist/{core → src/core}/RoutingEngine.js +98 -104
  226. package/dist/src/core/RoutingEngine.js.map +1 -0
  227. package/dist/src/core/SessionManager.d.ts +76 -0
  228. package/dist/src/core/SessionManager.d.ts.map +1 -0
  229. package/dist/src/core/SessionManager.js +193 -0
  230. package/dist/src/core/SessionManager.js.map +1 -0
  231. package/dist/src/core/Step.d.ts +96 -0
  232. package/dist/src/core/Step.d.ts.map +1 -0
  233. package/dist/src/core/Step.js +202 -0
  234. package/dist/src/core/Step.js.map +1 -0
  235. package/dist/src/core/ToolExecutor.d.ts +43 -0
  236. package/dist/src/core/ToolExecutor.d.ts.map +1 -0
  237. package/dist/src/core/ToolExecutor.js +70 -0
  238. package/dist/src/core/ToolExecutor.js.map +1 -0
  239. package/dist/{cjs → src}/index.d.ts +7 -15
  240. package/dist/src/index.d.ts.map +1 -0
  241. package/dist/{index.js → src/index.js} +6 -7
  242. package/dist/src/index.js.map +1 -0
  243. package/dist/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
  244. package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
  245. package/dist/{providers → src/providers}/AnthropicProvider.js +54 -2
  246. package/dist/src/providers/AnthropicProvider.js.map +1 -0
  247. package/dist/{cjs → src}/providers/GeminiProvider.d.ts +1 -1
  248. package/dist/{cjs → src}/providers/GeminiProvider.d.ts.map +1 -1
  249. package/dist/{providers → src/providers}/GeminiProvider.js +65 -0
  250. package/dist/src/providers/GeminiProvider.js.map +1 -0
  251. package/dist/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
  252. package/dist/{cjs → src}/providers/OpenAIProvider.d.ts.map +1 -1
  253. package/dist/{providers → src/providers}/OpenAIProvider.js +70 -1
  254. package/dist/src/providers/OpenAIProvider.js.map +1 -0
  255. package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts +1 -1
  256. package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts.map +1 -1
  257. package/dist/{providers → src/providers}/OpenRouterProvider.js +76 -0
  258. package/dist/src/providers/OpenRouterProvider.js.map +1 -0
  259. package/dist/src/providers/index.js.map +1 -0
  260. package/dist/{types → src/types}/agent.d.ts +54 -35
  261. package/dist/src/types/agent.d.ts.map +1 -0
  262. package/dist/src/types/agent.js.map +1 -0
  263. package/dist/{types → src/types}/ai.d.ts +7 -0
  264. package/dist/src/types/ai.d.ts.map +1 -0
  265. package/dist/{cjs → src}/types/ai.js.map +1 -1
  266. package/dist/{cjs → src}/types/history.d.ts +76 -18
  267. package/dist/src/types/history.d.ts.map +1 -0
  268. package/dist/src/types/history.js +30 -0
  269. package/dist/src/types/history.js.map +1 -0
  270. package/dist/src/types/index.d.ts +20 -0
  271. package/dist/src/types/index.d.ts.map +1 -0
  272. package/dist/src/types/index.js +10 -0
  273. package/dist/src/types/index.js.map +1 -0
  274. package/dist/{cjs → src}/types/persistence.d.ts +39 -23
  275. package/dist/src/types/persistence.d.ts.map +1 -0
  276. package/dist/src/types/persistence.js.map +1 -0
  277. package/dist/{types → src/types}/route.d.ts +85 -31
  278. package/dist/src/types/route.d.ts.map +1 -0
  279. package/dist/{types → src/types}/route.js.map +1 -1
  280. package/dist/src/types/session.d.ts +70 -0
  281. package/dist/src/types/session.d.ts.map +1 -0
  282. package/dist/src/types/session.js +5 -0
  283. package/dist/src/types/session.js.map +1 -0
  284. package/dist/src/types/template.d.ts +30 -0
  285. package/dist/src/types/template.d.ts.map +1 -0
  286. package/dist/src/types/template.js +2 -0
  287. package/dist/src/types/template.js.map +1 -0
  288. package/dist/{types → src/types}/tool.d.ts +6 -8
  289. package/dist/{cjs → src}/types/tool.d.ts.map +1 -1
  290. package/dist/{types → src/types}/tool.js.map +1 -1
  291. package/dist/src/utils/clone.d.ts +8 -0
  292. package/dist/src/utils/clone.d.ts.map +1 -0
  293. package/dist/src/utils/clone.js +33 -0
  294. package/dist/src/utils/clone.js.map +1 -0
  295. package/dist/{cjs → src}/utils/event.d.ts +1 -1
  296. package/dist/{cjs → src}/utils/event.d.ts.map +1 -1
  297. package/dist/{utils → src/utils}/event.js +1 -1
  298. package/dist/src/utils/event.js.map +1 -0
  299. package/dist/src/utils/history.d.ts +31 -0
  300. package/dist/src/utils/history.d.ts.map +1 -0
  301. package/dist/src/utils/history.js +121 -0
  302. package/dist/src/utils/history.js.map +1 -0
  303. package/dist/src/utils/id.js.map +1 -0
  304. package/dist/src/utils/index.d.ts +13 -0
  305. package/dist/src/utils/index.d.ts.map +1 -0
  306. package/dist/src/utils/index.js +19 -0
  307. package/dist/src/utils/index.js.map +1 -0
  308. package/dist/src/utils/logger.js.map +1 -0
  309. package/dist/src/utils/retry.js.map +1 -0
  310. package/dist/src/utils/session.d.ts +51 -0
  311. package/dist/src/utils/session.d.ts.map +1 -0
  312. package/dist/{types → src/utils}/session.js +34 -13
  313. package/dist/src/utils/session.js.map +1 -0
  314. package/dist/src/utils/template.d.ts +107 -0
  315. package/dist/src/utils/template.d.ts.map +1 -0
  316. package/dist/src/utils/template.js +276 -0
  317. package/dist/src/utils/template.js.map +1 -0
  318. package/docs/README.md +174 -68
  319. package/docs/{API_REFERENCE.md → api/README.md} +902 -263
  320. package/docs/api/overview.md +798 -0
  321. package/docs/core/agent/README.md +642 -0
  322. package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +144 -95
  323. package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +74 -59
  324. package/docs/core/ai-integration/prompt-composition.md +196 -0
  325. package/docs/core/ai-integration/providers.md +515 -0
  326. package/docs/core/ai-integration/response-processing.md +165 -0
  327. package/docs/core/conversation-flows/data-collection.md +545 -0
  328. package/docs/core/conversation-flows/route-dsl.md +479 -0
  329. package/docs/core/conversation-flows/routes.md +61 -0
  330. package/docs/core/conversation-flows/step-transitions.md +595 -0
  331. package/docs/core/conversation-flows/steps.md +130 -0
  332. package/docs/{ADAPTERS.md → core/persistence/adapters.md} +2 -2
  333. package/docs/core/persistence/session-storage.md +644 -0
  334. package/docs/core/routing/intelligent-routing.md +339 -0
  335. package/docs/core/tools/tool-definition.md +346 -0
  336. package/docs/core/tools/tool-execution.md +815 -0
  337. package/docs/core/tools/tool-scoping.md +628 -0
  338. package/docs/guides/getting-started/README.md +384 -0
  339. package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +104 -69
  340. package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +181 -103
  341. package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +102 -82
  342. package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +90 -69
  343. package/examples/ai-providers/anthropic-integration.ts +377 -0
  344. package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +37 -43
  345. package/examples/{route-transitions.ts → conversation-flows/completion-transitions.ts} +115 -108
  346. package/examples/{declarative-agent.ts → core-concepts/basic-agent.ts} +175 -131
  347. package/examples/core-concepts/schema-driven-extraction.ts +301 -0
  348. package/examples/core-concepts/session-management.ts +394 -0
  349. package/examples/integrations/database-integration.ts +615 -0
  350. package/examples/{healthcare-agent.ts → integrations/healthcare-integration.ts} +204 -111
  351. package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +159 -128
  352. package/examples/integrations/server-session-management.ts +299 -0
  353. package/examples/persistence/custom-adapter.ts +529 -0
  354. package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +168 -241
  355. package/examples/persistence/memory-sessions.ts +506 -0
  356. package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
  357. package/examples/{redis-persistence.ts → persistence/redis-persistence.ts} +152 -173
  358. package/examples/tools/basic-tools.ts +550 -0
  359. package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +82 -79
  360. package/package.json +14 -10
  361. package/src/adapters/MemoryAdapter.ts +74 -46
  362. package/src/adapters/MongoAdapter.ts +33 -24
  363. package/src/adapters/OpenSearchAdapter.ts +41 -37
  364. package/src/adapters/PostgreSQLAdapter.ts +35 -24
  365. package/src/adapters/PrismaAdapter.ts +69 -27
  366. package/src/adapters/RedisAdapter.ts +38 -26
  367. package/src/adapters/SQLiteAdapter.ts +32 -22
  368. package/src/core/Agent.ts +1102 -487
  369. package/src/core/Events.ts +100 -112
  370. package/src/core/PersistenceManager.ts +87 -57
  371. package/src/core/PromptComposer.ts +158 -85
  372. package/src/core/ResponseEngine.ts +118 -38
  373. package/src/core/ResponsePipeline.ts +715 -0
  374. package/src/core/Route.ts +168 -51
  375. package/src/core/RoutingEngine.ts +178 -209
  376. package/src/core/SessionManager.ts +241 -0
  377. package/src/core/Step.ts +149 -67
  378. package/src/core/ToolExecutor.ts +37 -42
  379. package/src/index.ts +31 -37
  380. package/src/providers/AnthropicProvider.ts +71 -5
  381. package/src/providers/GeminiProvider.ts +83 -2
  382. package/src/providers/OpenAIProvider.ts +95 -3
  383. package/src/providers/OpenRouterProvider.ts +102 -2
  384. package/src/types/agent.ts +50 -38
  385. package/src/types/ai.ts +7 -0
  386. package/src/types/history.ts +91 -18
  387. package/src/types/index.ts +43 -7
  388. package/src/types/persistence.ts +46 -28
  389. package/src/types/route.ts +104 -45
  390. package/src/types/session.ts +19 -213
  391. package/src/types/template.ts +36 -0
  392. package/src/types/tool.ts +9 -11
  393. package/src/utils/clone.ts +36 -0
  394. package/src/utils/event.ts +1 -1
  395. package/src/utils/history.ts +143 -0
  396. package/src/utils/index.ts +53 -0
  397. package/src/utils/session.ts +229 -0
  398. package/src/utils/template.ts +335 -0
  399. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  400. package/dist/adapters/MemoryAdapter.js.map +0 -1
  401. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  402. package/dist/adapters/MongoAdapter.js.map +0 -1
  403. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  404. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  405. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  406. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  407. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  408. package/dist/adapters/PrismaAdapter.js.map +0 -1
  409. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  410. package/dist/adapters/RedisAdapter.js.map +0 -1
  411. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  412. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  413. package/dist/adapters/index.d.ts.map +0 -1
  414. package/dist/adapters/index.js.map +0 -1
  415. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  416. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  417. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  418. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  419. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  420. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  421. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  422. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  423. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  424. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  425. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  426. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  427. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  428. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  429. package/dist/cjs/adapters/index.js.map +0 -1
  430. package/dist/cjs/constants/index.js.map +0 -1
  431. package/dist/cjs/core/Agent.d.ts.map +0 -1
  432. package/dist/cjs/core/Agent.js +0 -966
  433. package/dist/cjs/core/Agent.js.map +0 -1
  434. package/dist/cjs/core/DomainRegistry.d.ts +0 -36
  435. package/dist/cjs/core/DomainRegistry.d.ts.map +0 -1
  436. package/dist/cjs/core/DomainRegistry.js +0 -72
  437. package/dist/cjs/core/DomainRegistry.js.map +0 -1
  438. package/dist/cjs/core/Events.d.ts +0 -41
  439. package/dist/cjs/core/Events.d.ts.map +0 -1
  440. package/dist/cjs/core/Events.js +0 -99
  441. package/dist/cjs/core/Events.js.map +0 -1
  442. package/dist/cjs/core/PersistenceManager.d.ts +0 -96
  443. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  444. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  445. package/dist/cjs/core/PromptComposer.d.ts +0 -24
  446. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  447. package/dist/cjs/core/PromptComposer.js +0 -127
  448. package/dist/cjs/core/PromptComposer.js.map +0 -1
  449. package/dist/cjs/core/ResponseEngine.d.ts +0 -14
  450. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  451. package/dist/cjs/core/ResponseEngine.js +0 -56
  452. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  453. package/dist/cjs/core/Route.d.ts +0 -90
  454. package/dist/cjs/core/Route.d.ts.map +0 -1
  455. package/dist/cjs/core/Route.js.map +0 -1
  456. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  457. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  458. package/dist/cjs/core/Step.d.ts +0 -72
  459. package/dist/cjs/core/Step.d.ts.map +0 -1
  460. package/dist/cjs/core/Step.js +0 -150
  461. package/dist/cjs/core/Step.js.map +0 -1
  462. package/dist/cjs/core/Tool.d.ts +0 -39
  463. package/dist/cjs/core/Tool.d.ts.map +0 -1
  464. package/dist/cjs/core/Tool.js +0 -34
  465. package/dist/cjs/core/Tool.js.map +0 -1
  466. package/dist/cjs/core/ToolExecutor.d.ts +0 -29
  467. package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
  468. package/dist/cjs/core/ToolExecutor.js.map +0 -1
  469. package/dist/cjs/core/Transition.d.ts +0 -32
  470. package/dist/cjs/core/Transition.d.ts.map +0 -1
  471. package/dist/cjs/core/Transition.js +0 -89
  472. package/dist/cjs/core/Transition.js.map +0 -1
  473. package/dist/cjs/index.d.ts.map +0 -1
  474. package/dist/cjs/index.js.map +0 -1
  475. package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
  476. package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
  477. package/dist/cjs/providers/GeminiProvider.js.map +0 -1
  478. package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
  479. package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
  480. package/dist/cjs/providers/index.js.map +0 -1
  481. package/dist/cjs/types/agent.d.ts.map +0 -1
  482. package/dist/cjs/types/agent.js.map +0 -1
  483. package/dist/cjs/types/ai.d.ts.map +0 -1
  484. package/dist/cjs/types/history.d.ts.map +0 -1
  485. package/dist/cjs/types/history.js +0 -37
  486. package/dist/cjs/types/history.js.map +0 -1
  487. package/dist/cjs/types/index.d.ts +0 -12
  488. package/dist/cjs/types/index.d.ts.map +0 -1
  489. package/dist/cjs/types/index.js +0 -12
  490. package/dist/cjs/types/index.js.map +0 -1
  491. package/dist/cjs/types/persistence.d.ts.map +0 -1
  492. package/dist/cjs/types/persistence.js.map +0 -1
  493. package/dist/cjs/types/route.d.ts.map +0 -1
  494. package/dist/cjs/types/session.d.ts +0 -104
  495. package/dist/cjs/types/session.d.ts.map +0 -1
  496. package/dist/cjs/types/session.js.map +0 -1
  497. package/dist/cjs/utils/event.js.map +0 -1
  498. package/dist/cjs/utils/id.js.map +0 -1
  499. package/dist/cjs/utils/logger.js.map +0 -1
  500. package/dist/cjs/utils/retry.js.map +0 -1
  501. package/dist/constants/index.d.ts.map +0 -1
  502. package/dist/constants/index.js.map +0 -1
  503. package/dist/core/Agent.d.ts.map +0 -1
  504. package/dist/core/Agent.js +0 -962
  505. package/dist/core/Agent.js.map +0 -1
  506. package/dist/core/DomainRegistry.d.ts +0 -36
  507. package/dist/core/DomainRegistry.d.ts.map +0 -1
  508. package/dist/core/DomainRegistry.js +0 -68
  509. package/dist/core/DomainRegistry.js.map +0 -1
  510. package/dist/core/Events.d.ts +0 -41
  511. package/dist/core/Events.d.ts.map +0 -1
  512. package/dist/core/Events.js +0 -94
  513. package/dist/core/Events.js.map +0 -1
  514. package/dist/core/PersistenceManager.d.ts +0 -96
  515. package/dist/core/PersistenceManager.d.ts.map +0 -1
  516. package/dist/core/PersistenceManager.js.map +0 -1
  517. package/dist/core/PromptComposer.d.ts +0 -24
  518. package/dist/core/PromptComposer.d.ts.map +0 -1
  519. package/dist/core/PromptComposer.js +0 -123
  520. package/dist/core/PromptComposer.js.map +0 -1
  521. package/dist/core/ResponseEngine.d.ts +0 -14
  522. package/dist/core/ResponseEngine.d.ts.map +0 -1
  523. package/dist/core/ResponseEngine.js +0 -52
  524. package/dist/core/ResponseEngine.js.map +0 -1
  525. package/dist/core/Route.d.ts +0 -90
  526. package/dist/core/Route.d.ts.map +0 -1
  527. package/dist/core/Route.js.map +0 -1
  528. package/dist/core/RoutingEngine.d.ts.map +0 -1
  529. package/dist/core/RoutingEngine.js.map +0 -1
  530. package/dist/core/Step.d.ts +0 -72
  531. package/dist/core/Step.d.ts.map +0 -1
  532. package/dist/core/Step.js +0 -146
  533. package/dist/core/Step.js.map +0 -1
  534. package/dist/core/Tool.d.ts +0 -39
  535. package/dist/core/Tool.d.ts.map +0 -1
  536. package/dist/core/Tool.js +0 -31
  537. package/dist/core/Tool.js.map +0 -1
  538. package/dist/core/ToolExecutor.d.ts +0 -29
  539. package/dist/core/ToolExecutor.d.ts.map +0 -1
  540. package/dist/core/ToolExecutor.js +0 -69
  541. package/dist/core/ToolExecutor.js.map +0 -1
  542. package/dist/core/Transition.d.ts +0 -32
  543. package/dist/core/Transition.d.ts.map +0 -1
  544. package/dist/core/Transition.js +0 -85
  545. package/dist/core/Transition.js.map +0 -1
  546. package/dist/index.d.ts.map +0 -1
  547. package/dist/index.js.map +0 -1
  548. package/dist/providers/AnthropicProvider.d.ts.map +0 -1
  549. package/dist/providers/AnthropicProvider.js.map +0 -1
  550. package/dist/providers/GeminiProvider.d.ts.map +0 -1
  551. package/dist/providers/GeminiProvider.js.map +0 -1
  552. package/dist/providers/OpenAIProvider.d.ts.map +0 -1
  553. package/dist/providers/OpenAIProvider.js.map +0 -1
  554. package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
  555. package/dist/providers/OpenRouterProvider.js.map +0 -1
  556. package/dist/providers/index.d.ts.map +0 -1
  557. package/dist/providers/index.js.map +0 -1
  558. package/dist/types/agent.d.ts.map +0 -1
  559. package/dist/types/agent.js.map +0 -1
  560. package/dist/types/ai.d.ts.map +0 -1
  561. package/dist/types/ai.js.map +0 -1
  562. package/dist/types/history.d.ts.map +0 -1
  563. package/dist/types/history.js +0 -34
  564. package/dist/types/history.js.map +0 -1
  565. package/dist/types/index.d.ts +0 -12
  566. package/dist/types/index.d.ts.map +0 -1
  567. package/dist/types/index.js +0 -6
  568. package/dist/types/index.js.map +0 -1
  569. package/dist/types/persistence.d.ts.map +0 -1
  570. package/dist/types/persistence.js.map +0 -1
  571. package/dist/types/route.d.ts.map +0 -1
  572. package/dist/types/routing.d.ts.map +0 -1
  573. package/dist/types/schema.d.ts.map +0 -1
  574. package/dist/types/session.d.ts +0 -104
  575. package/dist/types/session.d.ts.map +0 -1
  576. package/dist/types/session.js.map +0 -1
  577. package/dist/types/tool.d.ts.map +0 -1
  578. package/dist/utils/event.d.ts.map +0 -1
  579. package/dist/utils/event.js.map +0 -1
  580. package/dist/utils/id.d.ts.map +0 -1
  581. package/dist/utils/id.js.map +0 -1
  582. package/dist/utils/logger.d.ts.map +0 -1
  583. package/dist/utils/logger.js.map +0 -1
  584. package/dist/utils/retry.d.ts.map +0 -1
  585. package/dist/utils/retry.js.map +0 -1
  586. package/docs/AGENT.md +0 -535
  587. package/docs/DOCS.md +0 -263
  588. package/docs/DOMAINS.md +0 -735
  589. package/docs/EXAMPLES.md +0 -467
  590. package/docs/GETTING_STARTED.md +0 -424
  591. package/docs/PERSISTENCE.md +0 -815
  592. package/docs/PROVIDERS.md +0 -612
  593. package/docs/ROUTES.md +0 -1085
  594. package/docs/STEPS.md +0 -883
  595. package/examples/business-onboarding.ts +0 -791
  596. package/examples/custom-database-persistence.ts +0 -574
  597. package/examples/domain-scoping.ts +0 -366
  598. package/examples/travel-agent.ts +0 -584
  599. package/src/core/DomainRegistry.ts +0 -80
  600. package/src/core/Tool.ts +0 -112
  601. package/src/core/Transition.ts +0 -115
  602. /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
  603. /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
  604. /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
  605. /package/dist/cjs/{constants → src/constants}/index.js +0 -0
  606. /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
  607. /package/dist/cjs/{providers → src/providers}/index.js +0 -0
  608. /package/dist/cjs/{types → src/types}/agent.js +0 -0
  609. /package/dist/cjs/{types → src/types}/ai.js +0 -0
  610. /package/dist/cjs/{types → src/types}/persistence.js +0 -0
  611. /package/dist/cjs/{types → src/types}/route.js +0 -0
  612. /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
  613. /package/dist/cjs/{types → src/types}/routing.js +0 -0
  614. /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
  615. /package/dist/cjs/{types → src/types}/schema.js +0 -0
  616. /package/dist/cjs/{types → src/types}/tool.js +0 -0
  617. /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
  618. /package/dist/cjs/{utils → src/utils}/id.js +0 -0
  619. /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
  620. /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
  621. /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
  622. /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
  623. /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
  624. /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
  625. /package/dist/{adapters → src/adapters}/index.js +0 -0
  626. /package/dist/{constants → src/constants}/index.d.ts +0 -0
  627. /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
  628. /package/dist/{constants → src/constants}/index.js +0 -0
  629. /package/dist/{providers → src/providers}/index.d.ts +0 -0
  630. /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
  631. /package/dist/{providers → src/providers}/index.js +0 -0
  632. /package/dist/{types → src/types}/agent.js +0 -0
  633. /package/dist/{types → src/types}/ai.js +0 -0
  634. /package/dist/{types → src/types}/persistence.js +0 -0
  635. /package/dist/{types → src/types}/route.js +0 -0
  636. /package/dist/{types → src/types}/routing.d.ts +0 -0
  637. /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
  638. /package/dist/{types → src/types}/routing.js +0 -0
  639. /package/dist/{cjs → src}/types/routing.js.map +0 -0
  640. /package/dist/{types → src/types}/schema.d.ts +0 -0
  641. /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
  642. /package/dist/{types → src/types}/schema.js +0 -0
  643. /package/dist/{cjs → src}/types/schema.js.map +0 -0
  644. /package/dist/{types → src/types}/tool.js +0 -0
  645. /package/dist/{utils → src/utils}/id.d.ts +0 -0
  646. /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
  647. /package/dist/{utils → src/utils}/id.js +0 -0
  648. /package/dist/{utils → src/utils}/logger.d.ts +0 -0
  649. /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
  650. /package/dist/{utils → src/utils}/logger.js +0 -0
  651. /package/dist/{utils → src/utils}/retry.d.ts +0 -0
  652. /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
  653. /package/dist/{utils → src/utils}/retry.js +0 -0
  654. /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
@@ -0,0 +1,815 @@
1
+ # Dynamic Tool Execution
2
+
3
+ @falai/agent provides a sophisticated tool execution system that enables AI agents to perform actions, access external data, and modify context dynamically during conversations. Unlike static tool calling, this system supports intelligent tool selection, context updates, and seamless integration with conversation flows.
4
+
5
+ ## Overview
6
+
7
+ The tool execution system provides:
8
+
9
+ - **Dynamic Tool Calling**: AI selects and executes tools based on conversation context
10
+ - **Context Modification**: Tools can update agent context and collected data
11
+ - **Streaming Execution**: Tools work with both streaming and non-streaming responses
12
+ - **Error Recovery**: Robust handling of tool execution failures
13
+ - **Multi-Step Tools**: Support for complex tool interaction patterns
14
+
15
+ ## Tool Definition
16
+
17
+ ### Basic Tool Structure
18
+
19
+ ```typescript
20
+ interface Tool<TContext, TArgs extends unknown[], TResult, TData> {
21
+ id: string;
22
+ name?: string; // Human-readable name shown to AI models
23
+ description: string;
24
+ parameters: StructuredSchema; // JSON Schema for tool arguments
25
+ handler: ToolHandler<TContext, TArgs, TResult, TData>;
26
+ }
27
+ ```
28
+
29
+ ### Creating Tools
30
+
31
+ ```typescript
32
+ import { Tool } from "@falai/agent";
33
+
34
+ // Simple data retrieval tool
35
+ const getWeather: Tool<unknown, [], string, WeatherData> = {
36
+ id: "get_weather",
37
+ name: "Weather Checker",
38
+ description: "Get current weather for a location",
39
+ parameters: {
40
+ type: "object",
41
+ properties: {
42
+ location: { type: "string", description: "City or location name" },
43
+ },
44
+ required: ["location"],
45
+ },
46
+ handler: async (toolContext, args) => {
47
+ const weather = await weatherAPI.getCurrentWeather(args.location);
48
+ return {
49
+ data: `Current weather in ${args.location}: ${weather.temperature}°C, ${weather.condition}`,
50
+ contextUpdate: {
51
+ lastWeatherCheck: new Date().toISOString(),
52
+ currentLocation: args.location,
53
+ },
54
+ };
55
+ },
56
+ };
57
+
58
+ // Data modification tool
59
+ const updateUserProfile: Tool<unknown, [], string, ProfileData> = {
60
+ id: "update_profile",
61
+ name: "Profile Updater",
62
+ description: "Update user profile information",
63
+ parameters: {
64
+ type: "object",
65
+ properties: {
66
+ field: { type: "string", description: "Field to update" },
67
+ value: { type: "string", description: "New value" },
68
+ },
69
+ required: ["field", "value"],
70
+ },
71
+ handler: async (toolContext, args) => {
72
+ // Validate field exists in schema
73
+ if (!toolContext.data || !(args.field in toolContext.data)) {
74
+ throw new Error(`Invalid field: ${args.field}`);
75
+ }
76
+
77
+ return {
78
+ data: `Updated ${args.field} to: ${args.value}`,
79
+ dataUpdate: { [args.field]: args.value }, // Update session data
80
+ };
81
+ },
82
+ };
83
+ ```
84
+
85
+ ## Tool Execution Flow
86
+
87
+ ### Automatic Tool Calling
88
+
89
+ Tools are executed automatically when the AI decides to use them:
90
+
91
+ ```typescript
92
+ const agent = new Agent({
93
+ name: "Smart Assistant",
94
+ provider: openaiProvider,
95
+ tools: [getWeather, updateUserProfile],
96
+
97
+ routes: [
98
+ agent.createRoute({
99
+ title: "Weather Query",
100
+ initialStep: {
101
+ prompt: "What's the weather like? I can check for you.",
102
+ tools: ["get_weather"], // Make tool available in this step
103
+ },
104
+ }),
105
+ ],
106
+ });
107
+
108
+ // Conversation flow:
109
+ // User: "What's the weather in Paris?"
110
+ // AI: Decides to call get_weather tool
111
+ // Tool executes and updates context
112
+ // AI: "Current weather in Paris: 22°C, Sunny"
113
+ ```
114
+
115
+ ### Tool Result Processing
116
+
117
+ ```typescript
118
+ interface ToolExecutionResult<TContext, TData> {
119
+ toolName: string;
120
+ success: boolean;
121
+ result?: {
122
+ data: unknown; // User-visible result
123
+ contextUpdate?: Partial<TContext>; // Context modifications
124
+ dataUpdate?: Partial<TData>; // Session data updates
125
+ };
126
+ error?: string;
127
+ }
128
+ ```
129
+
130
+ ## Context Integration
131
+
132
+ ### Context Updates
133
+
134
+ Tools can modify agent context:
135
+
136
+ ```typescript
137
+ const locationTracker: Tool<
138
+ { currentLocation?: string; locationHistory?: string[] },
139
+ [],
140
+ string,
141
+ { location: string }
142
+ > = {
143
+ id: "track_location",
144
+ description: "Track and update location information",
145
+ parameters: {
146
+ type: "object",
147
+ properties: {
148
+ location: { type: "string", description: "Location to track" },
149
+ },
150
+ required: ["location"],
151
+ },
152
+ handler: async ({ context }, { location }) => {
153
+ return {
154
+ data: `Location set to: ${location}`,
155
+ contextUpdate: {
156
+ currentLocation: location,
157
+ lastLocationUpdate: new Date().toISOString(),
158
+ locationHistory: (prev: string[]) => [...(prev || []), location],
159
+ },
160
+ };
161
+ },
162
+ };
163
+ ```
164
+
165
+ ### Context-Aware Tools
166
+
167
+ Tools can access current context:
168
+
169
+ ```typescript
170
+ const contextualTool: Tool<
171
+ { userName?: string; currentLocation?: string },
172
+ [],
173
+ string,
174
+ {}
175
+ > = {
176
+ id: "personalized_greeting",
177
+ description: "Generate personalized greeting based on context",
178
+ handler: async ({ context }) => {
179
+ const userName = context.userName || "friend";
180
+ const location = context.currentLocation || "unknown";
181
+
182
+ return {
183
+ data: `Hello ${userName} from ${location}! How can I help you today?`,
184
+ contextUpdate: {
185
+ lastInteraction: new Date().toISOString(),
186
+ },
187
+ };
188
+ },
189
+ };
190
+ ```
191
+
192
+ ## Data Collection Integration
193
+
194
+ ### Updating Collected Data
195
+
196
+ Tools can modify session-collected data:
197
+
198
+ ```typescript
199
+ const dataEnrichmentTool: Tool<{}, [], string, { email?: string }> = {
200
+ id: "enrich_user_data",
201
+ description: "Enrich user profile with additional information",
202
+ handler: async ({ data }) => {
203
+ if (!data?.email) {
204
+ throw new Error("Email required for enrichment");
205
+ }
206
+
207
+ const enriched = await userAPI.enrichProfile(data.email);
208
+
209
+ return {
210
+ data: "Profile enriched with additional information",
211
+ dataUpdate: {
212
+ enrichedAt: new Date().toISOString(),
213
+ profileComplete: true,
214
+ ...enriched, // Merge enriched data
215
+ },
216
+ };
217
+ },
218
+ };
219
+ ```
220
+
221
+ ### Validation Integration
222
+
223
+ ```typescript
224
+ const validatingTool: Tool<{}, [], string, any> = {
225
+ id: "validate_and_save",
226
+ description: "Validate collected data and save to database",
227
+ handler: async ({ data }) => {
228
+ // Validate collected data
229
+ const validation = validateUserData(data);
230
+
231
+ if (!validation.valid) {
232
+ return {
233
+ data: `Validation failed: ${validation.errors.join(", ")}`,
234
+ dataUpdate: {
235
+ validationErrors: validation.errors,
236
+ needsCorrection: true,
237
+ },
238
+ };
239
+ }
240
+
241
+ // Save to database
242
+ await saveUserData(data);
243
+
244
+ return {
245
+ data: "Data validated and saved successfully",
246
+ dataUpdate: {
247
+ savedAt: new Date().toISOString(),
248
+ validationStatus: "passed",
249
+ },
250
+ };
251
+ },
252
+ };
253
+ ```
254
+
255
+ ## Tool Scoping
256
+
257
+ ### Agent-Level Tools
258
+
259
+ Available to all routes and steps:
260
+
261
+ ```typescript
262
+ const agent = new Agent({
263
+ name: "Multi-Purpose Agent",
264
+ provider: provider,
265
+ tools: [globalSearchTool, userManagementTool], // Available everywhere
266
+
267
+ routes: [
268
+ route1, // Can use global tools
269
+ route2, // Can use global tools
270
+ ],
271
+ });
272
+ ```
273
+
274
+ ### Route-Level Tools
275
+
276
+ Specific to a route:
277
+
278
+ ```typescript
279
+ const supportRoute = agent.createRoute({
280
+ title: "Customer Support",
281
+ tools: [ticketCreationTool, knowledgeBaseTool], // Route-specific
282
+
283
+ initialStep: {
284
+ prompt: "How can I help you?",
285
+ tools: ["ticketCreationTool"], // Available in this step
286
+ },
287
+ });
288
+ ```
289
+
290
+ ### Step-Level Tools
291
+
292
+ Limited to specific conversation steps:
293
+
294
+ ```typescript
295
+ const dataCollectionStep = {
296
+ prompt: "Please provide your information",
297
+ collect: ["personalInfo"],
298
+ tools: ["dataValidationTool", "privacyCheckTool"], // Step-specific only
299
+ requires: ["userConsent"],
300
+ };
301
+ ```
302
+
303
+ ### Tool Resolution Priority
304
+
305
+ Tools are resolved in order of specificity:
306
+
307
+ ```typescript
308
+ // 1. Step-level tools (highest priority)
309
+ // 2. Route-level tools
310
+ // 3. Agent-level tools (lowest priority)
311
+
312
+ // Same tool ID in multiple scopes:
313
+ // Step tool overrides route tool overrides agent tool
314
+ ```
315
+
316
+ ## Streaming Tool Execution
317
+
318
+ ### Real-Time Tool Calls
319
+
320
+ Tools work seamlessly with streaming responses:
321
+
322
+ ```typescript
323
+ // Streaming response with tool execution
324
+ for await (const chunk of agent.respondStream({ history, session })) {
325
+ if (chunk.toolCalls) {
326
+ console.log("AI called tools:", chunk.toolCalls);
327
+ }
328
+
329
+ if (chunk.done) {
330
+ console.log("Final response:", chunk.accumulated);
331
+ console.log("Updated session:", chunk.session);
332
+ }
333
+ }
334
+ ```
335
+
336
+ ### Multi-Step Tool Loops
337
+
338
+ AI can make follow-up tool calls during streaming:
339
+
340
+ ```typescript
341
+ // AI might:
342
+ // 1. Call tool A
343
+ // 2. Process results
344
+ // 3. Call tool B based on A's results
345
+ // 4. Continue until satisfied
346
+
347
+ const MAX_TOOL_LOOPS = 5; // Prevent infinite loops
348
+ let toolLoopCount = 0;
349
+
350
+ while (hasToolCalls && toolLoopCount < MAX_TOOL_LOOPS) {
351
+ // Execute tools
352
+ // Update context with results
353
+ // Allow AI to make follow-up calls
354
+ toolLoopCount++;
355
+ }
356
+ ```
357
+
358
+ ## Error Handling & Recovery
359
+
360
+ ### Tool Execution Failures
361
+
362
+ ```typescript
363
+ const robustTool: Tool<
364
+ { lastApiCall?: string; errorCount?: number },
365
+ [],
366
+ string,
367
+ { endpoint: string }
368
+ > = {
369
+ id: "api_call",
370
+ description: "Make external API call with error handling",
371
+ parameters: {
372
+ type: "object",
373
+ properties: {
374
+ endpoint: { type: "string", description: "API endpoint to call" },
375
+ },
376
+ required: ["endpoint"],
377
+ },
378
+ handler: async ({ context }, { endpoint }) => {
379
+ try {
380
+ const result = await externalAPI.call(endpoint);
381
+ return {
382
+ data: `API call successful: ${result}`,
383
+ contextUpdate: { lastApiCall: "success" },
384
+ };
385
+ } catch (error) {
386
+ return {
387
+ data: `API call failed: ${(error as Error).message}`,
388
+ contextUpdate: {
389
+ lastApiCall: "failed",
390
+ errorCount: (count: number) => (count || 0) + 1,
391
+ },
392
+ };
393
+ }
394
+ },
395
+ };
396
+ ```
397
+
398
+ ### Fallback Tools
399
+
400
+ ```typescript
401
+ const fallbackTool: Tool<
402
+ { searchFallbackUsed?: boolean },
403
+ [],
404
+ string,
405
+ { query: string }
406
+ > = {
407
+ id: "fallback_search",
408
+ description: "Search with automatic fallback mechanisms",
409
+ parameters: {
410
+ type: "object",
411
+ properties: {
412
+ query: { type: "string", description: "Search query" },
413
+ },
414
+ required: ["query"],
415
+ },
416
+ handler: async ({ context }, { query }) => {
417
+ // Try primary search
418
+ try {
419
+ const result = await primarySearchAPI.search(query);
420
+ return {
421
+ data: `Primary search results: ${result}`,
422
+ contextUpdate: { searchFallbackUsed: false },
423
+ };
424
+ } catch (primaryError) {
425
+ // Fallback to secondary search
426
+ try {
427
+ const result = await secondarySearchAPI.search(query);
428
+ return {
429
+ data: `Secondary search results: ${result}`,
430
+ contextUpdate: { searchFallbackUsed: true },
431
+ };
432
+ } catch (secondaryError) {
433
+ // Final fallback
434
+ return {
435
+ data: "Search temporarily unavailable. Please try again later.",
436
+ contextUpdate: { searchFallbackUsed: true },
437
+ };
438
+ }
439
+ }
440
+ },
441
+ };
442
+ ```
443
+
444
+ ## Advanced Tool Patterns
445
+
446
+ ### Stateful Tools
447
+
448
+ Tools that maintain state across calls:
449
+
450
+ ```typescript
451
+ let toolState = { conversationId: null };
452
+
453
+ const conversationalTool: Tool<
454
+ { conversationState?: any; lastMessage?: string },
455
+ [],
456
+ string,
457
+ { message: string }
458
+ > = {
459
+ id: "continue_conversation",
460
+ description: "Continue multi-turn conversation with state management",
461
+ parameters: {
462
+ type: "object",
463
+ properties: {
464
+ message: { type: "string", description: "Message to send" },
465
+ },
466
+ required: ["message"],
467
+ },
468
+ handler: async ({ context }, { message }) => {
469
+ if (!toolState.conversationId) {
470
+ toolState.conversationId = generateId();
471
+ }
472
+
473
+ const response = await conversationAPI.sendMessage(
474
+ toolState.conversationId,
475
+ message
476
+ );
477
+
478
+ return {
479
+ data: response.message,
480
+ contextUpdate: {
481
+ conversationState: toolState,
482
+ lastMessage: message,
483
+ },
484
+ };
485
+ },
486
+ };
487
+ ```
488
+
489
+ ### Chainable Tools
490
+
491
+ Tools that set up data for other tools:
492
+
493
+ ```typescript
494
+ const setupTool: Tool<
495
+ { activeWorkflowId?: string; workflowType?: string; workflowStep?: number },
496
+ [],
497
+ string,
498
+ { workflowType: string }
499
+ > = {
500
+ id: "setup_workflow",
501
+ description: "Initialize a new workflow process",
502
+ parameters: {
503
+ type: "object",
504
+ properties: {
505
+ workflowType: {
506
+ type: "string",
507
+ enum: ["onboarding", "support", "sales"],
508
+ description: "Type of workflow to create",
509
+ },
510
+ },
511
+ required: ["workflowType"],
512
+ },
513
+ handler: async ({ context }, { workflowType }) => {
514
+ const workflowId = await workflowAPI.create(workflowType);
515
+
516
+ return {
517
+ data: `Workflow ${workflowId} created`,
518
+ contextUpdate: {
519
+ activeWorkflowId: workflowId,
520
+ workflowType,
521
+ workflowStep: 1,
522
+ },
523
+ };
524
+ },
525
+ };
526
+
527
+ const stepTool: Tool<
528
+ { activeWorkflowId?: string; workflowStep?: number; lastStepResult?: any },
529
+ [],
530
+ string,
531
+ {}
532
+ > = {
533
+ id: "execute_workflow_step",
534
+ description: "Execute the next step in active workflow",
535
+ handler: async ({ context }) => {
536
+ if (!context.activeWorkflowId) {
537
+ throw new Error("No active workflow");
538
+ }
539
+
540
+ const result = await workflowAPI.executeStep(
541
+ context.activeWorkflowId,
542
+ context.workflowStep || 1
543
+ );
544
+
545
+ return {
546
+ data: `Step ${context.workflowStep || 1} completed: ${result}`,
547
+ contextUpdate: {
548
+ workflowStep: (context.workflowStep || 1) + 1,
549
+ lastStepResult: result,
550
+ },
551
+ };
552
+ },
553
+ };
554
+ ```
555
+
556
+ ## Performance Optimization
557
+
558
+ ### Efficient Tool Execution
559
+
560
+ ```typescript
561
+ // Cache expensive operations
562
+ const cachedTool: Tool<{ lastCacheHit?: boolean }, [], any, { key: string }> = {
563
+ id: "cached_data_lookup",
564
+ description: "Lookup data with caching for performance",
565
+ parameters: {
566
+ type: "object",
567
+ properties: {
568
+ key: { type: "string", description: "Cache key for lookup" },
569
+ },
570
+ required: ["key"],
571
+ },
572
+ handler: async ({ context }, { key }) => {
573
+ // Check cache first
574
+ const cacheKey = `tool_cache_${key}`;
575
+ let result = cache.get(cacheKey);
576
+
577
+ if (!result) {
578
+ result = await expensiveOperation(key);
579
+ cache.set(cacheKey, result, 300000); // 5 minute cache
580
+ }
581
+
582
+ return {
583
+ data: result,
584
+ contextUpdate: { lastCacheHit: !!cache.get(cacheKey) },
585
+ };
586
+ },
587
+ };
588
+ ```
589
+
590
+ ### Batch Operations
591
+
592
+ ```typescript
593
+ const batchTool: Tool<
594
+ {},
595
+ [],
596
+ string,
597
+ { items: string[]; processedItems?: any[]; batchCompletedAt?: string }
598
+ > = {
599
+ id: "batch_process",
600
+ description: "Process multiple items in a single batch operation",
601
+ parameters: {
602
+ type: "object",
603
+ properties: {
604
+ items: {
605
+ type: "array",
606
+ items: { type: "string" },
607
+ description: "Items to process",
608
+ },
609
+ },
610
+ required: ["items"],
611
+ },
612
+ handler: async ({ context }, { items }) => {
613
+ // Process multiple items efficiently
614
+ const results = await Promise.all(items.map((item) => processItem(item)));
615
+
616
+ return {
617
+ data: `Processed ${results.length} items`,
618
+ dataUpdate: {
619
+ processedItems: results,
620
+ batchCompletedAt: new Date().toISOString(),
621
+ },
622
+ };
623
+ },
624
+ };
625
+ ```
626
+
627
+ ## Security & Access Control
628
+
629
+ ### Tool Permissions
630
+
631
+ ```typescript
632
+ const secureTool: Tool<{ userRole?: string }, [], any, { action: string }> = {
633
+ id: "admin_action",
634
+ description: "Perform administrative actions with permission checks",
635
+ parameters: {
636
+ type: "object",
637
+ properties: {
638
+ action: { type: "string", description: "Admin action to perform" },
639
+ },
640
+ required: ["action"],
641
+ },
642
+ handler: async ({ context }, { action }) => {
643
+ // Check permissions
644
+ if (context.userRole !== "admin") {
645
+ throw new Error("Insufficient permissions");
646
+ }
647
+
648
+ // Execute privileged action
649
+ const result = await performAdminAction(action);
650
+ return {
651
+ data: `Admin action completed: ${result}`,
652
+ contextUpdate: {
653
+ lastAdminAction: new Date().toISOString(),
654
+ },
655
+ };
656
+ },
657
+ };
658
+ ```
659
+
660
+ ### Input Validation
661
+
662
+ ```typescript
663
+ const validatedTool: Tool<
664
+ { userId?: string; userRole?: string },
665
+ [],
666
+ any,
667
+ { userId: string; updates: any }
668
+ > = {
669
+ id: "user_update",
670
+ description: "Update user data with validation and permission checks",
671
+ parameters: {
672
+ type: "object",
673
+ properties: {
674
+ userId: { type: "string", description: "User ID to update" },
675
+ updates: { type: "object", description: "Fields to update" },
676
+ },
677
+ required: ["userId", "updates"],
678
+ },
679
+ handler: async ({ context }, { userId, updates }) => {
680
+ // Validate user can only update their own data
681
+ if (context.userId !== userId && context.userRole !== "admin") {
682
+ throw new Error("Cannot update other users' data");
683
+ }
684
+
685
+ // Validate input data
686
+ const validatedUpdates = validateUpdates(updates);
687
+
688
+ const result = await updateUser(userId, validatedUpdates);
689
+ return {
690
+ data: `User ${userId} updated successfully`,
691
+ contextUpdate: {
692
+ lastUserUpdate: new Date().toISOString(),
693
+ },
694
+ };
695
+ },
696
+ };
697
+ ```
698
+
699
+ ## Debugging & Monitoring
700
+
701
+ ### Tool Execution Logging
702
+
703
+ ```typescript
704
+ // Enable debug mode for detailed logging
705
+ const agent = new Agent({
706
+ name: "Debug Agent",
707
+ debug: true,
708
+ provider: provider,
709
+ });
710
+
711
+ // Logs will show:
712
+ // [Agent] Executing dynamic tool: get_weather (success: true)
713
+ // [Agent] Tool updated collected data: { temperature: 22, condition: "sunny" }
714
+ // [Agent] Tool updated context: { lastWeatherCheck: "2024-01-15T10:30:00Z" }
715
+ ```
716
+
717
+ ### Performance Monitoring
718
+
719
+ ```typescript
720
+ const monitoredTool: Tool<{}, [], any, { args: any }> = {
721
+ id: "monitored_operation",
722
+ description: "Execute operation with performance monitoring",
723
+ parameters: {
724
+ type: "object",
725
+ properties: {
726
+ args: { type: "object", description: "Arguments for the operation" },
727
+ },
728
+ required: ["args"],
729
+ },
730
+ handler: async ({ context }, { args }) => {
731
+ const startTime = Date.now();
732
+
733
+ try {
734
+ const result = await performOperation(args);
735
+
736
+ // Log success metrics
737
+ metrics.record("tool_execution", {
738
+ tool: "monitored_operation",
739
+ duration: Date.now() - startTime,
740
+ success: true,
741
+ });
742
+
743
+ return {
744
+ data: `Operation completed: ${result}`,
745
+ contextUpdate: {
746
+ lastOperationDuration: Date.now() - startTime,
747
+ lastOperationSuccess: true,
748
+ },
749
+ };
750
+ } catch (error) {
751
+ // Log error metrics
752
+ metrics.record("tool_execution", {
753
+ tool: "monitored_operation",
754
+ duration: Date.now() - startTime,
755
+ success: false,
756
+ error: (error as Error).message,
757
+ });
758
+
759
+ return {
760
+ data: `Operation failed: ${(error as Error).message}`,
761
+ contextUpdate: {
762
+ lastOperationDuration: Date.now() - startTime,
763
+ lastOperationSuccess: false,
764
+ lastOperationError: (error as Error).message,
765
+ },
766
+ };
767
+ }
768
+ },
769
+ };
770
+ ```
771
+
772
+ ## Best Practices
773
+
774
+ ### Tool Design
775
+
776
+ 1. **Clear Purpose**: Each tool should do one thing well
777
+ 2. **Robust Error Handling**: Plan for failures and edge cases
778
+ 3. **Input Validation**: Validate all inputs thoroughly
779
+ 4. **Idempotent Operations**: Safe to call multiple times
780
+
781
+ ### Performance
782
+
783
+ 1. **Efficient Execution**: Cache results when possible
784
+ 2. **Resource Limits**: Implement timeouts and rate limits
785
+ 3. **Batch Operations**: Group related operations
786
+ 4. **Lazy Loading**: Load heavy dependencies only when needed
787
+
788
+ ### Security
789
+
790
+ 1. **Access Control**: Check permissions before execution
791
+ 2. **Input Sanitization**: Clean and validate all inputs
792
+ 3. **Audit Logging**: Log all tool executions
793
+ 4. **Rate Limiting**: Prevent abuse with rate limits
794
+
795
+ ### Testing
796
+
797
+ ```typescript
798
+ import { ToolExecutor } from "@falai/agent";
799
+
800
+ // Test tool execution
801
+ const executor = new ToolExecutor();
802
+ const result = await executor.executeTool({
803
+ tool,
804
+ context: mockContext,
805
+ data: mockData,
806
+ updateContext: async (updates) => {
807
+ /* mock implementation */
808
+ },
809
+ });
810
+
811
+ expect(result.success).toBe(true);
812
+ expect(result.data).toBeDefined();
813
+ ```
814
+
815
+ The dynamic tool execution system transforms static AI responses into interactive, context-aware conversations where the AI can perform real actions and adapt based on results.