@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
package/docs/ROUTES.md DELETED
@@ -1,1085 +0,0 @@
1
- # Routes Guide
2
-
3
- A complete guide to creating and managing conversational routes in `@falai/agent`.
4
-
5
- ---
6
-
7
- ## Table of Contents
8
-
9
- - [What is a Route?](#what-is-a-route)
10
- - [Creating Routes](#creating-routes)
11
- - [Initial Step Configuration](#initial-step-configuration)
12
- - [End Step Configuration](#end-step-configuration)
13
- - [Data Extraction](#data-extraction)
14
- - [Sequential Steps](#sequential-steps)
15
- - [Route Properties](#route-properties)
16
- - [Route Security](#route-security)
17
- - [Advanced Patterns](#advanced-patterns)
18
-
19
- ---
20
-
21
- ## What is a Route?
22
-
23
- A **Route** (also called a "Journey") represents a specific conversational flow in your agent. Think of it as a step machine that guides the conversation through a series of steps to accomplish a specific goal.
24
-
25
- ```typescript
26
- // Example: A route for booking flights
27
- const bookingRoute = agent.createRoute<FlightData>({
28
- title: "Book Flight",
29
- description: "Help user book a flight",
30
- conditions: ["User wants to book a flight"],
31
- });
32
- ```
33
-
34
- **Key Concepts:**
35
-
36
- - Each route has a **goal** (e.g., "book a flight", "answer FAQ", "collect feedback")
37
- - Routes contain **steps** that represent conversation steps
38
- - Routes can extract and track **typed data** throughout the conversation
39
- - Routes have their own **rules**, **prohibitions**, and **guidelines**
40
-
41
- ---
42
-
43
- ## Creating Routes
44
-
45
- ### Basic Route
46
-
47
- ```typescript
48
- interface FlightData {
49
- destination: string;
50
- departureDate: string;
51
- passengers: number;
52
- }
53
-
54
- const bookingRoute = agent.createRoute<FlightData>({
55
- title: "Book Flight",
56
- description: "Help user book a flight",
57
- conditions: [
58
- "User wants to book a flight",
59
- "User mentions flying or traveling",
60
- ],
61
- });
62
- ```
63
-
64
- ### Route with Data Extraction Schema
65
-
66
- ```typescript
67
- const bookingRoute = agent.createRoute<FlightData>({
68
- title: "Book Flight",
69
- description: "Help user book a flight",
70
- conditions: ["User wants to book a flight"],
71
-
72
- // Define what data to extract
73
- schema: {
74
- type: "object",
75
- properties: {
76
- destination: {
77
- type: "string",
78
- description: "Where the user wants to fly",
79
- },
80
- departureDate: {
81
- type: "string",
82
- description: "When they want to depart",
83
- },
84
- passengers: {
85
- type: "number",
86
- minimum: 1,
87
- maximum: 9,
88
- },
89
- },
90
- required: ["destination", "departureDate", "passengers"],
91
- },
92
- });
93
- ```
94
-
95
- ### Route with Rules and Prohibitions
96
-
97
- ```typescript
98
- const paymentRoute = agent.createRoute({
99
- title: "Process Payment",
100
- conditions: ["User wants to make a payment"],
101
-
102
- // Absolute rules the agent MUST follow
103
- rules: [
104
- "Always confirm the payment amount before processing",
105
- "Verify payment method is supported",
106
- "Provide a receipt after successful payment",
107
- ],
108
-
109
- // Things the agent must NEVER do
110
- prohibitions: [
111
- "Never store credit card numbers",
112
- "Never process payments without explicit confirmation",
113
- "Never share payment details with third parties",
114
- ],
115
- });
116
- ```
117
-
118
- ---
119
-
120
- ## Initial Step Configuration
121
-
122
- Every route starts with an initial step. You can now configure it in two ways:
123
-
124
- ### Option 1: Configure at Route Creation
125
-
126
- ```typescript
127
- const bookingRoute = agent.createRoute<FlightData>({
128
- title: "Book Flight",
129
-
130
- // Configure the initial step
131
- initialStep: {
132
- id: "welcome_step",
133
- instructions:
134
- "Welcome! I'll help you book a flight. Where would you like to go?",
135
- collect: ["destination"],
136
- skipIf: (data) => !!data.destination,
137
- },
138
-
139
- schema: {
140
- // ... schema definition
141
- },
142
- });
143
- ```
144
-
145
- ### Option 2: Configure After Route Creation
146
-
147
- ```typescript
148
- const bookingRoute = agent.createRoute<FlightData>({
149
- title: "Book Flight",
150
- // ... other options
151
- });
152
-
153
- // Configure initial step later
154
- bookingRoute.initialStep.configure({
155
- description: "Welcome! Let's book your flight",
156
- collectFields: ["destination"],
157
- skipIf: (data) => !!data.destination,
158
- });
159
- ```
160
-
161
- ### Initial Step Options
162
-
163
- ```typescript
164
- initialStep: {
165
- // Custom ID for the initial step
166
- id?: string;
167
-
168
- // Description/prompt for the initial step
169
- instructions?: string;
170
-
171
- // Fields to extract in this step
172
- collect?: string[];
173
-
174
- // Skip this step if condition is met
175
- skipIf?: (data: Partial<TData>) => boolean;
176
-
177
- // Prerequisites that must be metw
178
- requires?: string[];
179
- }
180
- ```
181
-
182
- ---
183
-
184
- ## End Step Configuration
185
-
186
- Every route ends when it reaches `END_ROUTE`. You can configure what happens at route completion:
187
-
188
- ### Configure End Step at Route Creation
189
-
190
- ```typescript
191
- import { END_ROUTE } from "@falai/agent";
192
-
193
- const bookingRoute = agent.createRoute<FlightData>({
194
- title: "Book Flight",
195
-
196
- // Configure what happens when route completes
197
- endStep: {
198
- // Custom completion message
199
- instructions: "Confirm the booking details and thank the user warmly!",
200
-
201
- // Optional: Execute final actions (like sending confirmation emails)
202
- tool: sendConfirmationEmail,
203
-
204
- // Optional: Collect final data before completing
205
- collect: ["finalConfirmation"],
206
-
207
- // Optional: Require certain data to be present
208
- requires: ["destination", "departureDate"],
209
-
210
- // Optional: Custom step ID
211
- id: "booking_complete",
212
- },
213
-
214
- schema: {
215
- // ... schema definition
216
- },
217
- });
218
-
219
- // Then just transition to END_ROUTE
220
- lastStep.nextStep({
221
- step: END_ROUTE,
222
- });
223
- ```
224
-
225
- ### Per-Transition Override
226
-
227
- You can also override the endStep configuration for specific transitions:
228
-
229
- ```typescript
230
- // Use route-level endStep
231
- lastStep.nextStep({
232
- step: END_ROUTE,
233
- });
234
-
235
- // OR override with custom instructions for this specific transition
236
- lastStep.nextStep({
237
- instructions: "Special completion message for this path!",
238
- step: END_ROUTE,
239
- });
240
- ```
241
-
242
- ### End Step Options
243
-
244
- ```typescript
245
- endStep: {
246
- // Completion message instruction (RECOMMENDED)
247
- instructions?: string;
248
-
249
- // Execute final tools/actions before completion
250
- tool?: ToolRef;
251
-
252
- // Collect final data at completion
253
- collect?: string[];
254
-
255
- // Require specific data to be present
256
- requires?: string[];
257
-
258
- // Custom step ID for debugging
259
- id?: string;
260
- }
261
- ```
262
-
263
- ### Default Behavior
264
-
265
- If you don't configure `endStep`, a smart default is used:
266
-
267
- ```typescript
268
- // Default endStep behavior:
269
- {
270
- instructions: "Summarize what was accomplished and confirm completion based on the conversation history and collected data";
271
- }
272
- ```
273
-
274
- ### End Step with Tools
275
-
276
- Execute final actions when route completes:
277
-
278
- ```typescript
279
- import { defineTool, END_ROUTE } from "@falai/agent";
280
-
281
- const sendConfirmation = defineTool("send_confirmation", async ({ data }) => {
282
- await emailService.send({
283
- to: data.email,
284
- subject: "Booking Confirmed",
285
- body: `Your flight to ${data.destination} is confirmed!`,
286
- });
287
- return { data: "Confirmation sent" };
288
- });
289
-
290
- const bookingRoute = agent.createRoute({
291
- title: "Book Flight",
292
-
293
- endStep: {
294
- tool: sendConfirmation, // Executes when route completes
295
- instructions: "Your booking is complete! Confirmation email sent.",
296
- },
297
- });
298
- ```
299
-
300
- **Key Points:**
301
-
302
- - ✅ `endStep` is configured once at the route level (DRY principle)
303
- - ✅ Can be overridden per-transition if needed
304
- - ✅ Supports full step capabilities: `instructions`, `tool`, `collect`, `requires`
305
- - ✅ Falls back to smart default if not configured
306
-
307
- ---
308
-
309
- ## Data Extraction
310
-
311
- ### Defining Extraction Schema
312
-
313
- The extraction schema defines what data your route will collect:
314
-
315
- ```typescript
316
- const onboardingRoute = agent.createRoute<OnboardingData>({
317
- title: "User Onboarding",
318
-
319
- schema: {
320
- type: "object",
321
- properties: {
322
- firstName: { type: "string" },
323
- lastName: { type: "string" },
324
- email: { type: "string", format: "email" },
325
- company: { type: "string" },
326
- role: {
327
- type: "string",
328
- enum: ["developer", "designer", "manager", "other"],
329
- },
330
- },
331
- required: ["firstName", "lastName", "email"],
332
- },
333
- });
334
- ```
335
-
336
- ### Getting Collected data
337
-
338
- ```typescript
339
- // Get collected data from the route
340
- const data = bookingRoute.getData(session);
341
-
342
- console.log(data);
343
- // { destination: "Paris", departureDate: "2025-06-15", passengers: 2 }
344
-
345
- // Only returns data if session is in this route
346
- const otherRouteData = otherRoute.getData(session);
347
- // {} - empty if session is in a different route
348
- ```
349
-
350
- ### Pre-populating Data
351
-
352
- You can pre-populate data when entering a route:
353
-
354
- ```typescript
355
- const bookingRoute = agent.createRoute<FlightData>({
356
- title: "Book Flight",
357
-
358
- // Pre-fill known information
359
- initialData: {
360
- destination: "Paris", // User mentioned this earlier
361
- passengers: 1, // Default value
362
- },
363
-
364
- schema: {
365
- // ... schema
366
- },
367
- });
368
-
369
- // Steps with skipIf will automatically bypass if data exists
370
- ```
371
-
372
- ---
373
-
374
- ## Sequential Steps
375
-
376
- For simple linear flows, use the `steps` option:
377
-
378
- ```typescript
379
- const feedbackRoute = agent.createRoute({
380
- title: "Collect Feedback",
381
-
382
- steps: [
383
- {
384
- id: "ask_rating",
385
- instructions: "How would you rate your experience? (1-5 stars)",
386
- collect: ["rating"],
387
- },
388
- {
389
- id: "ask_liked",
390
- instructions: "What did you like most?",
391
- collect: ["likedMost"],
392
- },
393
- {
394
- id: "ask_improve",
395
- instructions: "What could we improve?",
396
- collect: ["improvements"],
397
- },
398
- {
399
- id: "thank_you",
400
- instructions: "Thank you for your feedback! 🙏",
401
- },
402
- ],
403
- });
404
-
405
- // Automatically chains: initialStep → ask_rating → ask_liked → ask_improve → thank_you → END_ROUTE
406
- ```
407
-
408
- **When to use steps vs manual chaining:**
409
-
410
- - ✅ Use `steps` for: Linear flows, simple wizards, sequential data collection
411
- - ✅ Use manual chaining for: Branching logic, conditional flows, complex step machines
412
-
413
- ---
414
-
415
- ## Route Properties
416
-
417
- ### Accessing Route Properties
418
-
419
- ```typescript
420
- const route = agent.createRoute({ ... });
421
-
422
- // Route identification
423
- console.log(route.id); // "route_book_flight_abc123"
424
- console.log(route.title); // "Book Flight"
425
- console.log(route.description); // "Help user book a flight"
426
-
427
- // Activation conditions
428
- console.log(route.conditions); // ["User wants to book a flight"]
429
-
430
- // Rules and guidelines
431
- console.log(route.getRules()); // ["Always confirm...", ...]
432
- console.log(route.getProhibitions()); // ["Never store...", ...]
433
- console.log(route.getGuidelines()); // [{ condition: "...", action: "..." }]
434
-
435
- // Domain restrictions
436
- console.log(route.getDomains()); // ["payment", "booking"] or undefined
437
- ```
438
-
439
- ### Route Reference
440
-
441
- ```typescript
442
- const routeRef = route.getRef();
443
- console.log(routeRef); // { id: "route_book_flight_abc123" }
444
-
445
- // Use reference to jump to specific routes
446
- step.nextStep({ step: routeRef });
447
- ```
448
-
449
- ### Route Structure
450
-
451
- ```typescript
452
- // Get all steps in the route
453
- const steps = route.getAllSteps();
454
- console.log(steps); // [Step, Step, Step, ...]
455
-
456
- // Get specific step by ID
457
- const step = route.getStep("ask_destination");
458
-
459
- // Describe route structure
460
- console.log(route.describe());
461
- // Output:
462
- // Route: Book Flight
463
- // ID: route_book_flight_abc123
464
- // Description: Help user book a flight
465
- // Conditions: User wants to book a flight
466
- //
467
- // Steps:
468
- // - initial_step: Initial step
469
- // -> ask_destination
470
- // - ask_destination: Ask where they want to fly
471
- // -> ask_dates
472
- // ...
473
- ```
474
-
475
- ---
476
-
477
- ## Route Security
478
-
479
- ### Domain Scoping
480
-
481
- Restrict which tools/domains a route can access:
482
-
483
- ```typescript
484
- // Define domains
485
- agent.addDomain("payment", {
486
- processPayment: async (amount: number) => {
487
- /* ... */
488
- },
489
- refund: async (transactionId: string) => {
490
- /* ... */
491
- },
492
- });
493
-
494
- agent.addDomain("booking", {
495
- searchFlights: async (dest: string) => {
496
- /* ... */
497
- },
498
- createReservation: async (data: any) => {
499
- /* ... */
500
- },
501
- });
502
-
503
- agent.addDomain("database", {
504
- saveUser: async (user: any) => {
505
- /* ... */
506
- },
507
- deleteUser: async (userId: string) => {
508
- /* ... */
509
- },
510
- });
511
-
512
- // Payment route: only access payment tools
513
- const paymentRoute = agent.createRoute({
514
- title: "Process Payment",
515
- domains: ["payment"], // ONLY payment domain
516
- });
517
-
518
- // Booking route: access booking AND payment
519
- const bookingRoute = agent.createRoute({
520
- title: "Book Flight",
521
- domains: ["booking", "payment"], // Both domains
522
- });
523
-
524
- // Admin route: access everything
525
- const adminRoute = agent.createRoute({
526
- title: "Admin Actions",
527
- // domains: undefined = all domains allowed
528
- });
529
- ```
530
-
531
- **Security Benefits:**
532
-
533
- - ✅ Prevents accidental tool execution in wrong context
534
- - ✅ Reduces attack surface for each route
535
- - ✅ Makes permissions explicit and auditable
536
-
537
- ---
538
-
539
- ## Advanced Patterns
540
-
541
- ### Pattern 1: Branching Logic
542
-
543
- ```typescript
544
- const supportRoute = agent.createRoute<SupportData>({
545
- title: "Customer Support",
546
- });
547
-
548
- // Ask issue type
549
- const askIssueType = supportRoute.initialStep.nextStep({
550
- instructions: "What type of issue are you experiencing?",
551
- collect: ["issueType"],
552
- });
553
-
554
- // Branch 1: Technical issues
555
- const technicalFlow = askIssueType.nextStep({
556
- instructions: "Let me help with your technical issue...",
557
- condition: "Issue type is technical",
558
- });
559
-
560
- // Branch 2: Billing issues
561
- const billingFlow = askIssueType.nextStep({
562
- instructions: "Let me help with your billing issue...",
563
- condition: "Issue type is billing",
564
- });
565
-
566
- // Branch 3: General inquiries
567
- const generalFlow = askIssueType.nextStep({
568
- instructions: "Let me help with your inquiry...",
569
- condition: "Issue type is general",
570
- });
571
- ```
572
-
573
- ### Pattern 2: Conditional Skip Steps
574
-
575
- ```typescript
576
- const checkoutRoute = agent.createRoute<CheckoutData>({
577
- title: "Checkout",
578
- schema: {
579
- properties: {
580
- hasAccount: { type: "boolean" },
581
- email: { type: "string" },
582
- shippingAddress: { type: "object" },
583
- billingAddress: { type: "object" },
584
- },
585
- },
586
- });
587
-
588
- // Skip login if user already has account
589
- const login = checkoutRoute.initialStep.nextStep({
590
- instructions: "Please log in or continue as guest",
591
- collect: ["hasAccount", "email"],
592
- skipIf: (data) => data.hasAccount === true,
593
- });
594
-
595
- // Skip billing address if same as shipping
596
- const shippingAddress = login.nextStep({
597
- instructions: "What's your shipping address?",
598
- collect: ["shippingAddress"],
599
- });
600
-
601
- const billingAddress = shippingAddress.nextStep({
602
- instructions: "Is your billing address the same as shipping?",
603
- collect: ["billingAddress"],
604
- skipIf: (data) => data.billingAddress !== undefined,
605
- });
606
- ```
607
-
608
- ### Pattern 3: Route-Specific Guidelines
609
-
610
- ```typescript
611
- const bookingRoute = agent.createRoute({
612
- title: "Book Flight",
613
- });
614
-
615
- // Add guidelines specific to this route
616
- bookingRoute.createGuideline({
617
- condition: "User asks about cancellation policy",
618
- action: "Explain that cancellations must be made 24 hours in advance",
619
- tags: ["policy"],
620
- });
621
-
622
- bookingRoute.createGuideline({
623
- condition: "User provides invalid date",
624
- action: "Politely ask for a valid future date in YYYY-MM-DD format",
625
- tags: ["validation"],
626
- });
627
- ```
628
-
629
- ### Pattern 4: Tool Integration in Routes
630
-
631
- ```typescript
632
- import { defineTool } from "@falai/agent";
633
-
634
- const searchFlights = defineTool<MyContext, [], FlightResults>(
635
- "search_flights",
636
- async ({ context, data }) => {
637
- const flights = await api.searchFlights({
638
- destination: data.destination,
639
- date: data.departureDate,
640
- });
641
-
642
- return {
643
- data: flights,
644
- contextUpdate: { availableFlights: flights },
645
- };
646
- }
647
- );
648
-
649
- const bookingRoute = agent.createRoute<FlightData>({
650
- title: "Book Flight",
651
- domains: ["booking"], // Ensure tool is in this domain
652
- });
653
-
654
- // Collect data
655
- const collectDetails = bookingRoute.initialStep.nextStep({
656
- instructions: "Where and when would you like to fly?",
657
- collect: ["destination", "departureDate", "passengers"],
658
- });
659
-
660
- // Execute tool
661
- const searchStep = collectDetails.nextStep({
662
- tool: searchFlights,
663
- requires: ["destination", "departureDate", "passengers"],
664
- });
665
-
666
- // Present results
667
- const presentFlights = searchStep.nextStep({
668
- instructions: "Here are available flights based on your search",
669
- });
670
- ```
671
-
672
- ---
673
-
674
- ## Route Completion
675
-
676
- When a route reaches its final step and transitions to `END_ROUTE`, the agent returns `isRouteComplete: true` to signal that all required data has been collected.
677
-
678
- ### Ending a Route
679
-
680
- Use the `END_ROUTE` symbol to mark the end of a route:
681
-
682
- ```typescript
683
- import { END_ROUTE } from "@falai/agent";
684
-
685
- const onboardingRoute = agent.createRoute<OnboardingData>({
686
- title: "User Onboarding",
687
- schema: ONBOARDING_SCHEMA,
688
- });
689
-
690
- const askName = onboardingRoute.initialStep.nextStep({
691
- instructions: "What's your name?",
692
- collect: ["name"],
693
- });
694
-
695
- const askEmail = askName.nextStep({
696
- instructions: "What's your email?",
697
- collect: ["email"],
698
- });
699
-
700
- const thankYou = askEmail.nextStep({
701
- instructions: "Thank you! Your profile is complete.",
702
- });
703
-
704
- // End the route
705
- thankYou.nextStep({ step: END_ROUTE });
706
- ```
707
-
708
- ### Handling Completion
709
-
710
- There are **two ways** to check if a route has completed:
711
-
712
- #### Method 1: Using `isRouteComplete` (Recommended)
713
-
714
- ```typescript
715
- const response = await agent.respond({
716
- history,
717
- session,
718
- });
719
-
720
- if (response.isRouteComplete) {
721
- // ✅ Route is complete! All data has been collected
722
-
723
- // Get the collected data
724
- const data = agent.getData(response.session!);
725
- console.log("Collected data:", data);
726
-
727
- // Process the data
728
- await saveToDatabase(data);
729
- await sendConfirmationEmail(data.email);
730
-
731
- // Show custom completion message
732
- return "Thank you! Your information has been saved.";
733
- } else {
734
- // ⏳ Route still in progress
735
- return response.message;
736
- }
737
- ```
738
-
739
- #### Method 2: Using `END_ROUTE_ID` Constant
740
-
741
- For users who prefer a symbol-based pattern consistent with building routes:
742
-
743
- ```typescript
744
- import { END_ROUTE_ID } from "@falai/agent";
745
-
746
- const response = await agent.respond({
747
- history,
748
- session,
749
- });
750
-
751
- if (response.session?.currentStep?.id === END_ROUTE_ID) {
752
- // ✅ Route completed - currentStep is now END_ROUTE
753
- const data = agent.getData(response.session!);
754
- await handleCompletion(data);
755
- return "Complete!";
756
- }
757
-
758
- return response.message;
759
- ```
760
-
761
- **Which method should you use?**
762
-
763
- - ✅ **Use `isRouteComplete`** for simplicity and clarity
764
- - ✅ **Use `END_ROUTE_ID`** if you want consistency with how you build routes (`END_ROUTE` symbol)
765
-
766
- ---
767
-
768
- ## Route Transitions with `onComplete`
769
-
770
- **NEW:** You can now automatically transition to another route when a route completes using the `onComplete` option. This is perfect for chaining workflows like:
771
-
772
- - 📋 Post-booking feedback collection
773
- - 🎁 Upsell offers after purchase
774
- - 📊 Satisfaction surveys after support
775
- - ↩️ Error recovery flows
776
-
777
- ### Simple String Transition
778
-
779
- The simplest form - just specify the target route ID or title:
780
-
781
- ```typescript
782
- const bookingRoute = agent.createRoute<BookingData>({
783
- title: "Book Hotel",
784
- conditions: ["User wants to book a hotel"],
785
- schema: BOOKING_SCHEMA,
786
- // Automatically transition to feedback when booking completes
787
- onComplete: "Collect Feedback",
788
- });
789
-
790
- const feedbackRoute = agent.createRoute<FeedbackData>({
791
- title: "Collect Feedback",
792
- conditions: ["Collect user feedback"],
793
- schema: FEEDBACK_SCHEMA,
794
- });
795
- ```
796
-
797
- ### With AI-Evaluated Condition
798
-
799
- Add an optional condition that the AI evaluates to determine if transition should happen:
800
-
801
- ```typescript
802
- const bookingRoute = agent.createRoute<BookingData>({
803
- title: "Book Hotel",
804
- schema: BOOKING_SCHEMA,
805
- onComplete: {
806
- nextStep: "Collect Feedback",
807
- condition: "if booking was successful", // AI evaluates this
808
- },
809
- });
810
- ```
811
-
812
- ### Dynamic Function-Based Transition
813
-
814
- Use a function for complex logic based on collected data or context:
815
-
816
- ```typescript
817
- const bookingRoute = agent.createRoute<BookingData>({
818
- title: "Book Hotel",
819
- schema: BOOKING_SCHEMA,
820
- // Function receives session and context
821
- onComplete: (session, context) => {
822
- // Conditional logic based on collected data
823
- if (session.data?.guests && session.data.guests > 5) {
824
- return "VIP Feedback"; // Large groups get VIP treatment
825
- }
826
- if (session.data?.bookingFailed) {
827
- return "Error Recovery"; // Handle failures gracefully
828
- }
829
- return "Collect Feedback"; // Standard feedback flow
830
- },
831
- });
832
- ```
833
-
834
- Function can also return a config object:
835
-
836
- ```typescript
837
- onComplete: (session) => ({
838
- nextStep: "Collect Feedback",
839
- condition: session.data?.vip ? "if user is satisfied" : undefined,
840
- });
841
- ```
842
-
843
- ### How It Works
844
-
845
- 1. **Route completes** → reaches `END_ROUTE`
846
- 2. **Agent evaluates** `onComplete` handler
847
- 3. **Sets pending transition** in session step
848
- 4. **Next `respond()` call** → automatically transitions to target route
849
- 5. **User sees seamless flow** → no interruption in conversation
850
-
851
- ```typescript
852
- // User books hotel
853
- const response1 = await agent.respond({ history, session });
854
- console.log(response1.isRouteComplete); // true
855
- console.log(response1.session?.pendingTransition); // { targetRouteId: "...", reason: "route_complete" }
856
-
857
- // Next message automatically transitions to feedback route
858
- history.push(createMessageEvent(EventSource.CUSTOMER, "User", "Yes!"));
859
- const response2 = await agent.respond({ history, session: response1.session });
860
- console.log(response2.session?.currentRoute?.title); // "Collect Feedback"
861
- ```
862
-
863
- ### Manual Transition Control
864
-
865
- For more control, use `agent.nextStepRoute()` to manually set the transition:
866
-
867
- ```typescript
868
- const response = await agent.respond({ history, session });
869
-
870
- if (response.isRouteComplete && shouldCollectFeedback) {
871
- // Manually trigger transition instead of onComplete
872
- const updatedSession = agent.nextStepRoute(
873
- "Collect Feedback",
874
- response.session
875
- );
876
-
877
- // Next respond() will transition automatically
878
- const nextResponse = await agent.respond({
879
- history,
880
- session: updatedSession,
881
- });
882
- }
883
- ```
884
-
885
- ### Complete Example
886
-
887
- ```typescript
888
- interface BookingData {
889
- hotelName: string;
890
- date: string;
891
- guests: number;
892
- }
893
-
894
- interface FeedbackData {
895
- rating: number;
896
- comments?: string;
897
- }
898
-
899
- // Booking route with automatic transition to feedback
900
- const bookingRoute = agent.createRoute<BookingData>({
901
- title: "Book Hotel",
902
- conditions: ["User wants to book a hotel"],
903
- schema: {
904
- type: "object",
905
- properties: {
906
- hotelName: { type: "string" },
907
- date: { type: "string" },
908
- guests: { type: "number" },
909
- },
910
- required: ["hotelName", "date", "guests"],
911
- },
912
- onComplete: "Collect Feedback",
913
- });
914
-
915
- const askHotel = bookingRoute.initialStep.nextStep({
916
- instructions: "Ask which hotel",
917
- collect: ["hotelName"],
918
- skipIf: (e) => !!e.hotelName,
919
- });
920
-
921
- const askDate = askHotel.nextStep({
922
- instructions: "Ask for date",
923
- collect: ["date"],
924
- skipIf: (e) => !!e.date,
925
- });
926
-
927
- const askGuests = askDate.nextStep({
928
- instructions: "Ask for guests",
929
- collect: ["guests"],
930
- skipIf: (e) => !!e.guests,
931
- });
932
-
933
- askGuests.nextStep({
934
- instructions: "Confirm booking",
935
- step: END_ROUTE,
936
- });
937
-
938
- // Feedback route
939
- const feedbackRoute = agent.createRoute<FeedbackData>({
940
- title: "Collect Feedback",
941
- conditions: ["Collect user feedback"],
942
- schema: {
943
- type: "object",
944
- properties: {
945
- rating: { type: "number" },
946
- comments: { type: "string" },
947
- },
948
- required: ["rating"],
949
- },
950
- });
951
-
952
- const askRating = feedbackRoute.initialStep.nextStep({
953
- instructions: "Ask for rating 1-5",
954
- collect: ["rating"],
955
- });
956
-
957
- askRating.nextStep({
958
- instructions: "Thank user",
959
- step: END_ROUTE,
960
- });
961
-
962
- // Usage - seamless transition from booking to feedback
963
- let session;
964
- const response1 = await agent.respond({ history, session });
965
- // Booking complete, pending transition set
966
-
967
- history.push(createMessageEvent(EventSource.CUSTOMER, "User", "Yes!"));
968
- const response2 = await agent.respond({ history, session: response1.session });
969
- // Now in feedback route automatically
970
- ```
971
-
972
- ### Benefits
973
-
974
- ✅ **Seamless user experience** - No awkward pauses between flows
975
- ✅ **Predictable behavior** - Transitions defined at design time
976
- ✅ **Flexible** - Simple strings, conditions, or complex functions
977
- ✅ **Type-safe** - Full TypeScript inference for collected data
978
- ✅ **Non-breaking** - Existing routes without `onComplete` work as before
979
-
980
- See [examples/route-transitions.ts](../examples/route-transitions.ts) for a complete working example.
981
-
982
- ### Immediate Completion
983
-
984
- Routes can complete **immediately** if all steps are skipped due to `skipIf` conditions. This is useful when:
985
-
986
- - Resuming a partially completed route
987
- - Pre-filling data from an existing session
988
- - User provides all information upfront
989
-
990
- ```typescript
991
- const onboardingRoute = agent.createRoute<OnboardingData>({
992
- title: "User Onboarding",
993
- schema: ONBOARDING_SCHEMA,
994
- initialData: existingUserData, // Pre-fill with existing data
995
- });
996
-
997
- const askName = onboardingRoute.initialStep.nextStep({
998
- instructions: "What's your name?",
999
- collect: ["name"],
1000
- skipIf: (data) => !!data.name, // Skip if name exists
1001
- });
1002
-
1003
- const askEmail = askName.nextStep({
1004
- instructions: "What's your email?",
1005
- collect: ["email"],
1006
- skipIf: (data) => !!data.email, // Skip if email exists
1007
- });
1008
-
1009
- const complete = askEmail.nextStep({
1010
- instructions: "All done!",
1011
- });
1012
-
1013
- complete.nextStep({ step: END_ROUTE });
1014
-
1015
- // In your handler:
1016
- const response = await agent.respond({ history, session });
1017
-
1018
- if (response.isRouteComplete) {
1019
- // If existingUserData had all fields, route completes immediately!
1020
- // The routing engine recursively skips all steps and reaches END_ROUTE
1021
- console.log("Profile already complete!");
1022
- }
1023
- ```
1024
-
1025
- ### Important Notes
1026
-
1027
- - **`isRouteComplete: true`** indicates the route has reached `END_ROUTE`
1028
- - **`currentStep.id`** is set to `END_ROUTE_ID` when the route completes
1029
- - **`response.message`** will be empty (`""`) when route is complete
1030
- - **The routing engine** recursively traverses skipped steps to detect completion
1031
- - **You can check either** `isRouteComplete` or `currentStep.id === END_ROUTE_ID`
1032
- - **Session step** still contains all the collected data via `agent.getData()`
1033
- - **The route** (`currentRoute.id`) remains the completed route (e.g., "onboarding"), not END_ROUTE
1034
-
1035
- ### With Streaming
1036
-
1037
- ```typescript
1038
- for await (const chunk of agent.respondStream({ history, session })) {
1039
- if (chunk.delta) {
1040
- process.stdout.write(chunk.delta);
1041
- }
1042
-
1043
- if (chunk.done && chunk.isRouteComplete) {
1044
- console.log("\n🎉 Route completed!");
1045
- const data = agent.getData(chunk.session!);
1046
- await processCompletedData(data);
1047
- }
1048
- }
1049
- ```
1050
-
1051
- ---
1052
-
1053
- ## Best Practices
1054
-
1055
- ### ✅ Do's
1056
-
1057
- - **Use descriptive titles and descriptions** - Makes routing more accurate
1058
- - **Define extraction schemas** - Type-safe data collection
1059
- - **Configure initial step** - Set up proper entry point
1060
- - **Use skipIf for known data** - Avoid redundant questions
1061
- - **Scope domains** - Limit tool access per route
1062
- - **Add route-specific guidelines** - Context-aware behavior
1063
- - **Use steps for linear flows** - Cleaner code for simple paths
1064
-
1065
- ### ❌ Don'ts
1066
-
1067
- - **Don't use vague conditions** - Be specific about when to activate
1068
- - **Don't skip extraction schemas** - Loses type safety
1069
- - **Don't create overly complex routes** - Split into multiple routes
1070
- - **Don't forget requires** - Prevent steps from executing too early
1071
- - **Don't mix concerns** - One route = one goal
1072
- - **Don't hardcode step IDs** - Let framework generate deterministic IDs
1073
-
1074
- ---
1075
-
1076
- ## See Also
1077
-
1078
- - [Steps Guide](./STEPS.md) - Deep dive into step management
1079
- - [API Reference - Route](./API_REFERENCE.md#route) - Complete API docs
1080
- - [Examples](../examples/) - Real-world route implementations
1081
- - [Architecture Guide](./ARCHITECTURE.md) - How routes fit in the system
1082
-
1083
- ---
1084
-
1085
- **Made with ❤️ for the community**