@falai/agent 0.8.1 → 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 (652) 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 +65 -67
  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/{core → cjs/src/core}/PersistenceManager.d.ts +21 -19
  43. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  44. package/dist/cjs/{core → src/core}/PersistenceManager.js +50 -20
  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 +52 -33
  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 +34 -11
  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 +65 -67
  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/{cjs → src}/core/PersistenceManager.d.ts +21 -19
  204. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  205. package/dist/{core → src/core}/PersistenceManager.js +47 -17
  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 +52 -33
  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 +32 -11
  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} +890 -251
  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} +143 -94
  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} +1 -1
  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} +112 -105
  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 +1093 -478
  369. package/src/core/Events.ts +100 -112
  370. package/src/core/PersistenceManager.ts +77 -47
  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 +48 -36
  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.map +0 -1
  443. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  444. package/dist/cjs/core/PromptComposer.d.ts +0 -24
  445. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  446. package/dist/cjs/core/PromptComposer.js +0 -127
  447. package/dist/cjs/core/PromptComposer.js.map +0 -1
  448. package/dist/cjs/core/ResponseEngine.d.ts +0 -14
  449. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  450. package/dist/cjs/core/ResponseEngine.js +0 -56
  451. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  452. package/dist/cjs/core/Route.d.ts +0 -90
  453. package/dist/cjs/core/Route.d.ts.map +0 -1
  454. package/dist/cjs/core/Route.js.map +0 -1
  455. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  456. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  457. package/dist/cjs/core/Step.d.ts +0 -72
  458. package/dist/cjs/core/Step.d.ts.map +0 -1
  459. package/dist/cjs/core/Step.js +0 -150
  460. package/dist/cjs/core/Step.js.map +0 -1
  461. package/dist/cjs/core/Tool.d.ts +0 -39
  462. package/dist/cjs/core/Tool.d.ts.map +0 -1
  463. package/dist/cjs/core/Tool.js +0 -34
  464. package/dist/cjs/core/Tool.js.map +0 -1
  465. package/dist/cjs/core/ToolExecutor.d.ts +0 -29
  466. package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
  467. package/dist/cjs/core/ToolExecutor.js.map +0 -1
  468. package/dist/cjs/core/Transition.d.ts +0 -32
  469. package/dist/cjs/core/Transition.d.ts.map +0 -1
  470. package/dist/cjs/core/Transition.js +0 -89
  471. package/dist/cjs/core/Transition.js.map +0 -1
  472. package/dist/cjs/index.d.ts.map +0 -1
  473. package/dist/cjs/index.js.map +0 -1
  474. package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
  475. package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
  476. package/dist/cjs/providers/GeminiProvider.js.map +0 -1
  477. package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
  478. package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
  479. package/dist/cjs/providers/index.js.map +0 -1
  480. package/dist/cjs/types/agent.d.ts.map +0 -1
  481. package/dist/cjs/types/agent.js.map +0 -1
  482. package/dist/cjs/types/ai.d.ts.map +0 -1
  483. package/dist/cjs/types/history.d.ts.map +0 -1
  484. package/dist/cjs/types/history.js +0 -37
  485. package/dist/cjs/types/history.js.map +0 -1
  486. package/dist/cjs/types/index.d.ts +0 -12
  487. package/dist/cjs/types/index.d.ts.map +0 -1
  488. package/dist/cjs/types/index.js +0 -12
  489. package/dist/cjs/types/index.js.map +0 -1
  490. package/dist/cjs/types/persistence.d.ts.map +0 -1
  491. package/dist/cjs/types/persistence.js.map +0 -1
  492. package/dist/cjs/types/route.d.ts.map +0 -1
  493. package/dist/cjs/types/session.d.ts +0 -104
  494. package/dist/cjs/types/session.d.ts.map +0 -1
  495. package/dist/cjs/types/session.js.map +0 -1
  496. package/dist/cjs/utils/event.js.map +0 -1
  497. package/dist/cjs/utils/id.js.map +0 -1
  498. package/dist/cjs/utils/logger.js.map +0 -1
  499. package/dist/cjs/utils/retry.js.map +0 -1
  500. package/dist/constants/index.d.ts.map +0 -1
  501. package/dist/constants/index.js.map +0 -1
  502. package/dist/core/Agent.d.ts.map +0 -1
  503. package/dist/core/Agent.js +0 -962
  504. package/dist/core/Agent.js.map +0 -1
  505. package/dist/core/DomainRegistry.d.ts +0 -36
  506. package/dist/core/DomainRegistry.d.ts.map +0 -1
  507. package/dist/core/DomainRegistry.js +0 -68
  508. package/dist/core/DomainRegistry.js.map +0 -1
  509. package/dist/core/Events.d.ts +0 -41
  510. package/dist/core/Events.d.ts.map +0 -1
  511. package/dist/core/Events.js +0 -94
  512. package/dist/core/Events.js.map +0 -1
  513. package/dist/core/PersistenceManager.d.ts.map +0 -1
  514. package/dist/core/PersistenceManager.js.map +0 -1
  515. package/dist/core/PromptComposer.d.ts +0 -24
  516. package/dist/core/PromptComposer.d.ts.map +0 -1
  517. package/dist/core/PromptComposer.js +0 -123
  518. package/dist/core/PromptComposer.js.map +0 -1
  519. package/dist/core/ResponseEngine.d.ts +0 -14
  520. package/dist/core/ResponseEngine.d.ts.map +0 -1
  521. package/dist/core/ResponseEngine.js +0 -52
  522. package/dist/core/ResponseEngine.js.map +0 -1
  523. package/dist/core/Route.d.ts +0 -90
  524. package/dist/core/Route.d.ts.map +0 -1
  525. package/dist/core/Route.js.map +0 -1
  526. package/dist/core/RoutingEngine.d.ts.map +0 -1
  527. package/dist/core/RoutingEngine.js.map +0 -1
  528. package/dist/core/Step.d.ts +0 -72
  529. package/dist/core/Step.d.ts.map +0 -1
  530. package/dist/core/Step.js +0 -146
  531. package/dist/core/Step.js.map +0 -1
  532. package/dist/core/Tool.d.ts +0 -39
  533. package/dist/core/Tool.d.ts.map +0 -1
  534. package/dist/core/Tool.js +0 -31
  535. package/dist/core/Tool.js.map +0 -1
  536. package/dist/core/ToolExecutor.d.ts +0 -29
  537. package/dist/core/ToolExecutor.d.ts.map +0 -1
  538. package/dist/core/ToolExecutor.js +0 -69
  539. package/dist/core/ToolExecutor.js.map +0 -1
  540. package/dist/core/Transition.d.ts +0 -32
  541. package/dist/core/Transition.d.ts.map +0 -1
  542. package/dist/core/Transition.js +0 -85
  543. package/dist/core/Transition.js.map +0 -1
  544. package/dist/index.d.ts.map +0 -1
  545. package/dist/index.js.map +0 -1
  546. package/dist/providers/AnthropicProvider.d.ts.map +0 -1
  547. package/dist/providers/AnthropicProvider.js.map +0 -1
  548. package/dist/providers/GeminiProvider.d.ts.map +0 -1
  549. package/dist/providers/GeminiProvider.js.map +0 -1
  550. package/dist/providers/OpenAIProvider.d.ts.map +0 -1
  551. package/dist/providers/OpenAIProvider.js.map +0 -1
  552. package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
  553. package/dist/providers/OpenRouterProvider.js.map +0 -1
  554. package/dist/providers/index.d.ts.map +0 -1
  555. package/dist/providers/index.js.map +0 -1
  556. package/dist/types/agent.d.ts.map +0 -1
  557. package/dist/types/agent.js.map +0 -1
  558. package/dist/types/ai.d.ts.map +0 -1
  559. package/dist/types/ai.js.map +0 -1
  560. package/dist/types/history.d.ts.map +0 -1
  561. package/dist/types/history.js +0 -34
  562. package/dist/types/history.js.map +0 -1
  563. package/dist/types/index.d.ts +0 -12
  564. package/dist/types/index.d.ts.map +0 -1
  565. package/dist/types/index.js +0 -6
  566. package/dist/types/index.js.map +0 -1
  567. package/dist/types/persistence.d.ts.map +0 -1
  568. package/dist/types/persistence.js.map +0 -1
  569. package/dist/types/route.d.ts.map +0 -1
  570. package/dist/types/routing.d.ts.map +0 -1
  571. package/dist/types/schema.d.ts.map +0 -1
  572. package/dist/types/session.d.ts +0 -104
  573. package/dist/types/session.d.ts.map +0 -1
  574. package/dist/types/session.js.map +0 -1
  575. package/dist/types/tool.d.ts.map +0 -1
  576. package/dist/utils/event.d.ts.map +0 -1
  577. package/dist/utils/event.js.map +0 -1
  578. package/dist/utils/id.d.ts.map +0 -1
  579. package/dist/utils/id.js.map +0 -1
  580. package/dist/utils/logger.d.ts.map +0 -1
  581. package/dist/utils/logger.js.map +0 -1
  582. package/dist/utils/retry.d.ts.map +0 -1
  583. package/dist/utils/retry.js.map +0 -1
  584. package/docs/AGENT.md +0 -535
  585. package/docs/DOCS.md +0 -263
  586. package/docs/DOMAINS.md +0 -735
  587. package/docs/EXAMPLES.md +0 -467
  588. package/docs/GETTING_STARTED.md +0 -424
  589. package/docs/PERSISTENCE.md +0 -815
  590. package/docs/PROVIDERS.md +0 -612
  591. package/docs/ROUTES.md +0 -1085
  592. package/docs/STEPS.md +0 -883
  593. package/examples/business-onboarding.ts +0 -791
  594. package/examples/custom-database-persistence.ts +0 -574
  595. package/examples/domain-scoping.ts +0 -366
  596. package/examples/travel-agent.ts +0 -584
  597. package/src/core/DomainRegistry.ts +0 -80
  598. package/src/core/Tool.ts +0 -112
  599. package/src/core/Transition.ts +0 -115
  600. /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
  601. /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
  602. /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
  603. /package/dist/cjs/{constants → src/constants}/index.js +0 -0
  604. /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
  605. /package/dist/cjs/{providers → src/providers}/index.js +0 -0
  606. /package/dist/cjs/{types → src/types}/agent.js +0 -0
  607. /package/dist/cjs/{types → src/types}/ai.js +0 -0
  608. /package/dist/cjs/{types → src/types}/persistence.js +0 -0
  609. /package/dist/cjs/{types → src/types}/route.js +0 -0
  610. /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
  611. /package/dist/cjs/{types → src/types}/routing.js +0 -0
  612. /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
  613. /package/dist/cjs/{types → src/types}/schema.js +0 -0
  614. /package/dist/cjs/{types → src/types}/tool.js +0 -0
  615. /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
  616. /package/dist/cjs/{utils → src/utils}/id.js +0 -0
  617. /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
  618. /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
  619. /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
  620. /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
  621. /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
  622. /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
  623. /package/dist/{adapters → src/adapters}/index.js +0 -0
  624. /package/dist/{constants → src/constants}/index.d.ts +0 -0
  625. /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
  626. /package/dist/{constants → src/constants}/index.js +0 -0
  627. /package/dist/{providers → src/providers}/index.d.ts +0 -0
  628. /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
  629. /package/dist/{providers → src/providers}/index.js +0 -0
  630. /package/dist/{types → src/types}/agent.js +0 -0
  631. /package/dist/{types → src/types}/ai.js +0 -0
  632. /package/dist/{types → src/types}/persistence.js +0 -0
  633. /package/dist/{types → src/types}/route.js +0 -0
  634. /package/dist/{types → src/types}/routing.d.ts +0 -0
  635. /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
  636. /package/dist/{types → src/types}/routing.js +0 -0
  637. /package/dist/{cjs → src}/types/routing.js.map +0 -0
  638. /package/dist/{types → src/types}/schema.d.ts +0 -0
  639. /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
  640. /package/dist/{types → src/types}/schema.js +0 -0
  641. /package/dist/{cjs → src}/types/schema.js.map +0 -0
  642. /package/dist/{types → src/types}/tool.js +0 -0
  643. /package/dist/{utils → src/utils}/id.d.ts +0 -0
  644. /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
  645. /package/dist/{utils → src/utils}/id.js +0 -0
  646. /package/dist/{utils → src/utils}/logger.d.ts +0 -0
  647. /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
  648. /package/dist/{utils → src/utils}/logger.js +0 -0
  649. /package/dist/{utils → src/utils}/retry.d.ts +0 -0
  650. /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
  651. /package/dist/{utils → src/utils}/retry.js +0 -0
  652. /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Schema-Driven Data Extraction Example
3
+ *
4
+ * This example demonstrates how to use JSON Schema to define data contracts
5
+ * and extract structured data reliably from conversations.
6
+ *
7
+ * Key concepts:
8
+ * - Schema-first data definition
9
+ * - Type-safe data extraction
10
+ * - Automatic validation
11
+ * - SkipIf conditions for smart flow control
12
+ */
13
+
14
+ import { Agent, GeminiProvider, type Tool } from "../../src/index";
15
+
16
+ // Define the data structure we want to collect
17
+ interface UserProfileData {
18
+ name: string;
19
+ email: string;
20
+ age: number;
21
+ interests: string[];
22
+ preferredContact: "email" | "phone" | "sms";
23
+ newsletterOptIn: boolean;
24
+ }
25
+
26
+ // Define a tool that uses the collected data
27
+ const saveUserProfile: Tool<unknown, [], string, UserProfileData> = {
28
+ id: "save_user_profile",
29
+ description: "Save the collected user profile information",
30
+ parameters: {
31
+ type: "object",
32
+ properties: {},
33
+ },
34
+ handler: ({ data }) => {
35
+ console.log("Saving user profile:", data);
36
+
37
+ // Simulate saving to database
38
+ console.log("Profile data:", data);
39
+
40
+ const userData = data as Partial<UserProfileData>;
41
+ return {
42
+ data: `Profile saved successfully! Welcome ${userData?.name}!`,
43
+ };
44
+ },
45
+ };
46
+
47
+ // Create the agent
48
+ const agent = new Agent({
49
+ name: "ProfileBot",
50
+ description:
51
+ "A bot that collects user profile information using schema-driven extraction",
52
+ provider: new GeminiProvider({
53
+ apiKey: process.env.GEMINI_API_KEY!,
54
+ model: "models/gemini-2.5-flash",
55
+ }),
56
+ });
57
+
58
+ // Define the schema for data validation and extraction
59
+ const userProfileSchema = {
60
+ type: "object",
61
+ properties: {
62
+ name: {
63
+ type: "string",
64
+ description: "The user's full name",
65
+ minLength: 2,
66
+ maxLength: 100,
67
+ },
68
+ email: {
69
+ type: "string",
70
+ format: "email",
71
+ description: "The user's email address",
72
+ },
73
+ age: {
74
+ type: "number",
75
+ description: "The user's age in years",
76
+ minimum: 13,
77
+ maximum: 120,
78
+ },
79
+ interests: {
80
+ type: "array",
81
+ items: { type: "string" },
82
+ description: "User's interests and hobbies",
83
+ minItems: 1,
84
+ maxItems: 10,
85
+ },
86
+ preferredContact: {
87
+ type: "string",
88
+ enum: ["email", "phone", "sms"],
89
+ description: "Preferred contact method",
90
+ default: "email",
91
+ },
92
+ newsletterOptIn: {
93
+ type: "boolean",
94
+ description: "Whether user wants to receive newsletters",
95
+ default: false,
96
+ },
97
+ },
98
+ required: ["name", "email"],
99
+ };
100
+
101
+ // Create a route that collects profile information step by step
102
+ agent.createRoute<UserProfileData>({
103
+ title: "User Profile Collection",
104
+ description: "Collect comprehensive user profile information",
105
+ schema: userProfileSchema,
106
+ // Use sequential steps for a linear flow with smart skipIf conditions
107
+ steps: [
108
+ {
109
+ id: "ask_name",
110
+ description: "Ask for user's name",
111
+ prompt: "Hi! I'd like to create a profile for you. What's your name?",
112
+ collect: ["name"],
113
+ skipIf: (data: Partial<UserProfileData>) => !!data.name,
114
+ },
115
+ {
116
+ id: "ask_email",
117
+ description: "Ask for user's email",
118
+ prompt: "What's your email address?",
119
+ collect: ["email"],
120
+ requires: ["name"],
121
+ skipIf: (data: Partial<UserProfileData>) => !!data.email,
122
+ },
123
+ {
124
+ id: "ask_age",
125
+ description: "Ask for user's age (optional)",
126
+ prompt: "How old are you? (optional)",
127
+ collect: ["age"],
128
+ requires: ["name", "email"],
129
+ skipIf: (data: Partial<UserProfileData>) => data.age !== undefined,
130
+ },
131
+ {
132
+ id: "ask_interests",
133
+ description: "Ask for user's interests (optional)",
134
+ prompt: "What are your interests or hobbies? (optional)",
135
+ collect: ["interests"],
136
+ requires: ["name", "email"],
137
+ skipIf: (data: Partial<UserProfileData>) =>
138
+ !!(data.interests && data.interests.length > 0),
139
+ },
140
+ {
141
+ id: "ask_contact_preference",
142
+ description: "Ask for preferred contact method",
143
+ prompt: "What's your preferred contact method?",
144
+ collect: ["preferredContact"],
145
+ requires: ["name", "email"],
146
+ skipIf: (data: Partial<UserProfileData>) => !!data.preferredContact,
147
+ },
148
+ {
149
+ id: "ask_newsletter",
150
+ description: "Ask about newsletter subscription",
151
+ prompt: "Would you like to subscribe to our newsletter?",
152
+ collect: ["newsletterOptIn"],
153
+ requires: ["name", "email"],
154
+ skipIf: (data: Partial<UserProfileData>) =>
155
+ data.newsletterOptIn !== undefined,
156
+ },
157
+ {
158
+ id: "save_profile",
159
+ description: "Save the collected profile",
160
+ prompt:
161
+ "Thanks for providing your information! Let me save your profile.",
162
+ tools: [saveUserProfile],
163
+ requires: ["name", "email"],
164
+ },
165
+ ],
166
+ });
167
+
168
+ // Example conversation demonstrating schema-driven extraction
169
+ async function demonstrateSchemaExtraction() {
170
+ console.log("=== Schema-Driven Data Extraction Demo ===\n");
171
+
172
+ // First message - user provides name and email
173
+ console.log("User: Hi, I'm John Doe and my email is john@example.com");
174
+ const response1 = await agent.respond({
175
+ history: [
176
+ {
177
+ role: "user",
178
+ content: "Hi, I'm John Doe and my email is john@example.com",
179
+ name: "John",
180
+ },
181
+ ],
182
+ });
183
+
184
+ console.log("Bot:", response1.message);
185
+ console.log(
186
+ "Collected data:",
187
+ JSON.stringify(response1.session?.data as Partial<UserProfileData>, null, 2)
188
+ );
189
+
190
+ // Second message - user provides more information
191
+ console.log(
192
+ "\nUser: I'm 30 years old and I like hiking, reading, and photography"
193
+ );
194
+ const response2 = await agent.respond({
195
+ history: [
196
+ {
197
+ role: "user",
198
+ content: "Hi, I'm John Doe and my email is john@example.com",
199
+ name: "John",
200
+ },
201
+ {
202
+ role: "assistant",
203
+ content: response1.message,
204
+ },
205
+ {
206
+ role: "user",
207
+ content: "I'm 30 years old and I like hiking, reading, and photography",
208
+ name: "John",
209
+ },
210
+ ],
211
+ session: response1.session,
212
+ });
213
+
214
+ console.log("Bot:", response2.message);
215
+ console.log(
216
+ "Collected data:",
217
+ JSON.stringify(response2.session?.data as Partial<UserProfileData>, null, 2)
218
+ );
219
+
220
+ // Third message - user provides contact preference and completes profile
221
+ console.log(
222
+ "\nUser: Please contact me by email and yes, I'd like the newsletter"
223
+ );
224
+ const response3 = await agent.respond({
225
+ history: [
226
+ {
227
+ role: "user",
228
+ content: "Hi, I'm John Doe and my email is john@example.com",
229
+ name: "John",
230
+ },
231
+ {
232
+ role: "assistant",
233
+ content: response1.message,
234
+ },
235
+ {
236
+ role: "user",
237
+ content: "I'm 30 years old and I like hiking, reading, and photography",
238
+ name: "John",
239
+ },
240
+ {
241
+ role: "assistant",
242
+ content: response2.message,
243
+ },
244
+ {
245
+ role: "user",
246
+ content: "Please contact me by email and yes, I'd like the newsletter",
247
+ name: "John",
248
+ },
249
+ ],
250
+ session: response2.session,
251
+ });
252
+
253
+ console.log("Bot:", response3.message);
254
+ console.log(
255
+ "Final collected data:",
256
+ JSON.stringify(response3.session?.data as Partial<UserProfileData>, null, 2)
257
+ );
258
+ console.log("Route complete:", response3.isRouteComplete);
259
+ }
260
+
261
+ // Demonstrate with a single comprehensive message
262
+ async function demonstrateSmartSkipping() {
263
+ console.log("\n=== Smart Skipping Demo ===\n");
264
+
265
+ console.log("User provides everything in one message:");
266
+ console.log(
267
+ "User: I'm Sarah Johnson, sarah@email.com, 28 years old. I enjoy cooking, travel, and music. Contact me by phone and yes to newsletter."
268
+ );
269
+
270
+ const response = await agent.respond({
271
+ history: [
272
+ {
273
+ role: "user",
274
+ content:
275
+ "I'm Sarah Johnson, sarah@email.com, 28 years old. I enjoy cooking, travel, and music. Contact me by phone and yes to newsletter.",
276
+ name: "Sarah",
277
+ },
278
+ ],
279
+ });
280
+
281
+ console.log("Bot:", response.message);
282
+ console.log(
283
+ "Collected data:",
284
+ JSON.stringify(response.session?.data as Partial<UserProfileData>, null, 2)
285
+ );
286
+ console.log("Route complete:", response.isRouteComplete);
287
+ }
288
+
289
+ // Run the demonstrations
290
+ async function main() {
291
+ try {
292
+ await demonstrateSchemaExtraction();
293
+ await demonstrateSmartSkipping();
294
+ } catch (error) {
295
+ console.error("Error:", error);
296
+ }
297
+ }
298
+
299
+ if (import.meta.url === `file://${process.argv[1]}`) {
300
+ main().catch(console.error);
301
+ }
@@ -0,0 +1,394 @@
1
+ /**
2
+ * Session Management Example
3
+ *
4
+ * This example demonstrates how to manage conversation state across multiple turns
5
+ * using session management, persistence, and state restoration.
6
+ *
7
+ * Key concepts:
8
+ * - Session state management
9
+ * - Multi-turn conversations
10
+ * - Data persistence across turns
11
+ * - Session restoration
12
+ * - Route transitions with session state
13
+ */
14
+
15
+ import {
16
+ Agent,
17
+ GeminiProvider,
18
+ MemoryAdapter,
19
+ type Tool,
20
+ } from "../../src/index";
21
+
22
+ // Define data types for our multi-step process
23
+ interface OrderData {
24
+ customerName: string;
25
+ productType: "laptop" | "phone" | "tablet";
26
+ budget: number;
27
+ preferredColor?: string;
28
+ urgentDelivery: boolean;
29
+ orderId?: string;
30
+ }
31
+
32
+ interface OrderContext {
33
+ userId: string;
34
+ userName: string;
35
+ isVip: boolean;
36
+ }
37
+
38
+ interface PaymentData {
39
+ orderId: string;
40
+ paymentMethod: "credit_card" | "paypal" | "bank_transfer";
41
+ amount: number;
42
+ confirmed: boolean;
43
+ }
44
+
45
+ // Tools for order processing
46
+ const createOrder: Tool<unknown, [], string, OrderData> = {
47
+ id: "create_order",
48
+ description: "Create a new order from the collected order data",
49
+ parameters: {
50
+ type: "object",
51
+ properties: {},
52
+ },
53
+ handler: ({ data }) => {
54
+ const orderId = `ORD-${Date.now()}`;
55
+ const orderData = data as Partial<OrderData>;
56
+ console.log(`Creating order ${orderId} for ${orderData?.customerName}`);
57
+
58
+ return {
59
+ data: `Order ${orderId} created successfully!`,
60
+ dataUpdate: {
61
+ orderId,
62
+ },
63
+ };
64
+ },
65
+ };
66
+
67
+ const processPayment: Tool<unknown, [], string, PaymentData> = {
68
+ id: "process_payment",
69
+ description: "Process payment for an order",
70
+ parameters: {
71
+ type: "object",
72
+ properties: {},
73
+ },
74
+ handler: ({ data }) => {
75
+ const paymentData = data as Partial<PaymentData>;
76
+ console.log(`Processing payment for order ${paymentData?.orderId}`);
77
+
78
+ // Simulate payment processing
79
+ const success = Math.random() > 0.1; // 90% success rate
80
+
81
+ if (success) {
82
+ return {
83
+ data: `Payment processed successfully! Order ${paymentData?.orderId} is now confirmed.`,
84
+ dataUpdate: {
85
+ confirmed: true,
86
+ },
87
+ };
88
+ } else {
89
+ return {
90
+ data: "Payment failed. Please try again or contact support.",
91
+ dataUpdate: {
92
+ confirmed: false,
93
+ },
94
+ };
95
+ }
96
+ },
97
+ };
98
+
99
+ // Create agent with persistence
100
+ const agent = new Agent({
101
+ name: "OrderBot",
102
+ description:
103
+ "A bot that handles multi-step order processing with session management",
104
+ provider: new GeminiProvider({
105
+ apiKey: process.env.GEMINI_API_KEY!,
106
+ model: "models/gemini-2.5-flash",
107
+ }),
108
+ persistence: {
109
+ adapter: new MemoryAdapter(), // In production, use RedisAdapter, PrismaAdapter, etc.
110
+ },
111
+ });
112
+
113
+ // Order collection route with sequential steps
114
+ agent.createRoute<OrderData>({
115
+ title: "Product Order",
116
+ description: "Collect order details and create an order",
117
+ schema: {
118
+ type: "object",
119
+ properties: {
120
+ customerName: { type: "string" },
121
+ productType: { type: "string", enum: ["laptop", "phone", "tablet"] },
122
+ budget: { type: "number", minimum: 100 },
123
+ preferredColor: { type: "string" },
124
+ urgentDelivery: { type: "boolean" },
125
+ orderId: { type: "string" },
126
+ },
127
+ required: ["customerName", "productType", "budget"],
128
+ },
129
+ // Sequential steps for order collection
130
+ steps: [
131
+ {
132
+ id: "ask_name",
133
+ description: "Ask for customer name",
134
+ prompt: "Hi! I'd like to help you place an order. What's your name?",
135
+ collect: ["customerName"],
136
+ skipIf: (data: Partial<OrderData>) => !!data.customerName,
137
+ },
138
+ {
139
+ id: "ask_product",
140
+ description: "Ask for product type",
141
+ prompt: "What would you like to order? (laptop, phone, or tablet)",
142
+ collect: ["productType"],
143
+ requires: ["customerName"],
144
+ skipIf: (data: Partial<OrderData>) => !!data.productType,
145
+ },
146
+ {
147
+ id: "ask_budget",
148
+ description: "Ask for budget",
149
+ prompt: "What's your budget for this purchase?",
150
+ collect: ["budget"],
151
+ requires: ["customerName", "productType"],
152
+ skipIf: (data: Partial<OrderData>) => data.budget !== undefined,
153
+ },
154
+ {
155
+ id: "ask_color",
156
+ description: "Ask for preferred color",
157
+ prompt: "Do you have a preferred color?",
158
+ collect: ["preferredColor"],
159
+ requires: ["customerName", "productType", "budget"],
160
+ skipIf: (data: Partial<OrderData>) => !!data.preferredColor,
161
+ },
162
+ {
163
+ id: "ask_urgent",
164
+ description: "Ask about urgent delivery",
165
+ prompt: "Do you need urgent delivery?",
166
+ collect: ["urgentDelivery"],
167
+ requires: ["customerName", "productType", "budget"],
168
+ skipIf: (data: Partial<OrderData>) => data.urgentDelivery !== undefined,
169
+ },
170
+ {
171
+ id: "create_order",
172
+ description: "Create the order",
173
+ prompt: "Great! Let me create your order.",
174
+ tools: [createOrder],
175
+ requires: ["customerName", "productType", "budget"],
176
+ },
177
+ ],
178
+ onComplete: {
179
+ nextStep: "Payment Processing",
180
+ condition: "Order has been created successfully",
181
+ },
182
+ });
183
+
184
+ // Payment route with sequential steps
185
+ agent.createRoute<PaymentData>({
186
+ title: "Payment Processing",
187
+ description: "Process payment for an order",
188
+ schema: {
189
+ type: "object",
190
+ properties: {
191
+ orderId: { type: "string" },
192
+ paymentMethod: {
193
+ type: "string",
194
+ enum: ["credit_card", "paypal", "bank_transfer"],
195
+ },
196
+ amount: { type: "number" },
197
+ confirmed: { type: "boolean" },
198
+ },
199
+ required: ["orderId", "paymentMethod", "amount"],
200
+ },
201
+ // Sequential steps for payment processing
202
+ steps: [
203
+ {
204
+ id: "ask_payment_method",
205
+ description: "Ask for payment method",
206
+ prompt:
207
+ "Now let's process payment for your order. What payment method would you prefer?",
208
+ collect: ["paymentMethod"],
209
+ skipIf: (data: Partial<PaymentData>) => !!data.paymentMethod,
210
+ },
211
+ {
212
+ id: "ask_amount",
213
+ description: "Ask for payment amount",
214
+ prompt: "What's the payment amount?",
215
+ collect: ["amount"],
216
+ requires: ["paymentMethod"],
217
+ skipIf: (data: Partial<PaymentData>) => data.amount !== undefined,
218
+ },
219
+ {
220
+ id: "process_payment",
221
+ description: "Process the payment",
222
+ prompt: "Processing your payment...",
223
+ tools: [processPayment],
224
+ requires: ["orderId", "paymentMethod", "amount"],
225
+ },
226
+ ],
227
+ onComplete: "Order Complete", // End conversation when payment is complete
228
+ });
229
+
230
+ // Demonstration of automatic session management
231
+ async function demonstrateSessionManagement() {
232
+ console.log("=== Automatic Session Management Demo ===\n");
233
+
234
+ // Create agent with automatic session management
235
+ const sessionAgent = new Agent({
236
+ name: "OrderBot",
237
+ description: "A bot that handles multi-step order processing",
238
+ provider: new GeminiProvider({
239
+ apiKey: process.env.GEMINI_API_KEY!,
240
+ model: "models/gemini-2.5-flash",
241
+ }),
242
+ persistence: {
243
+ adapter: new MemoryAdapter(),
244
+ },
245
+ sessionId: "user-alice-123", // Automatically creates/loads this session
246
+ });
247
+
248
+ // Copy routes to the session agent
249
+ agent.getRoutes().forEach(route => {
250
+ sessionAgent.createRoute(route);
251
+ });
252
+
253
+ // Turn 1: Start order process - simple message API
254
+ console.log("Turn 1: Starting order process");
255
+ console.log("User: Hi, I'm Alice and I want to buy a laptop");
256
+
257
+ const response1 = await sessionAgent.chat("Hi, I'm Alice and I want to buy a laptop");
258
+
259
+ console.log("Bot:", response1.message);
260
+ console.log("Session ID:", sessionAgent.session.id);
261
+ console.log("Session data:", JSON.stringify(sessionAgent.session.getData<OrderData>(), null, 2));
262
+ console.log("History length:", sessionAgent.session.getHistory().length);
263
+ console.log();
264
+
265
+ // Turn 2: Provide budget - session automatically maintained
266
+ console.log("Turn 2: Providing budget");
267
+ console.log("User: My budget is $1500");
268
+
269
+ const response2 = await sessionAgent.chat("My budget is $1500");
270
+
271
+ console.log("Bot:", response2.message);
272
+ console.log("Session data:", JSON.stringify(sessionAgent.session.getData<OrderData>(), null, 2));
273
+ console.log("History length:", sessionAgent.session.getHistory().length);
274
+ console.log();
275
+
276
+ // Turn 3: Complete order details - session automatically updated
277
+ console.log("Turn 3: Completing order and transitioning to payment");
278
+ console.log("User: I want black color and urgent delivery please");
279
+
280
+ const response3 = await sessionAgent.chat("I want black color and urgent delivery please");
281
+
282
+ console.log("Bot:", response3.message);
283
+ console.log("Session data:", JSON.stringify(sessionAgent.session.getData<OrderData>(), null, 2));
284
+ console.log("Route complete:", response3.isRouteComplete);
285
+ console.log("History length:", sessionAgent.session.getHistory().length);
286
+ console.log();
287
+
288
+ // Turn 4: Process payment - automatic route transition
289
+ console.log("Turn 4: Processing payment in transitioned route");
290
+ console.log("User: I'll pay with credit card, amount is $1599");
291
+
292
+ const response4 = await sessionAgent.chat("I'll pay with credit card, amount is $1599");
293
+
294
+ console.log("Bot:", response4.message);
295
+ console.log("Session data:", JSON.stringify(sessionAgent.session.getData<PaymentData>(), null, 2));
296
+ console.log("Route complete:", response4.isRouteComplete);
297
+ console.log("Final history length:", sessionAgent.session.getHistory().length);
298
+ }
299
+
300
+ // Demonstrate automatic session persistence and restoration
301
+ async function demonstrateSessionPersistence() {
302
+ console.log("\n=== Automatic Session Persistence Demo ===\n");
303
+
304
+ // Create agent with specific sessionId for demonstration
305
+ const sessionId = "demo-session-456";
306
+ const persistentAgent = new Agent<OrderContext>({
307
+ name: "Order Assistant",
308
+ description: "Help customers place orders with automatic persistence",
309
+ provider: new GeminiProvider({
310
+ apiKey: process.env.GEMINI_API_KEY!,
311
+ model: "models/gemini-2.5-flash",
312
+ }),
313
+ context: {
314
+ userId: "user_alice",
315
+ userName: "Alice",
316
+ isVip: false,
317
+ },
318
+ persistence: {
319
+ adapter: new MemoryAdapter(),
320
+ autoSave: true, // Automatic persistence
321
+ },
322
+ sessionId, // Agent automatically loads or creates this session
323
+ });
324
+
325
+ // Copy routes to the persistent agent
326
+ agent.getRoutes().forEach(route => {
327
+ persistentAgent.createRoute(route);
328
+ });
329
+
330
+ console.log("Session ready:", persistentAgent.session.id);
331
+
332
+ // Start conversation - session automatically managed
333
+ const response1 = await persistentAgent.chat("I want to buy a phone for $800");
334
+
335
+ console.log("After first interaction:");
336
+ console.log("🤖 Agent:", response1.message);
337
+ console.log("Session data:", JSON.stringify(persistentAgent.session.getData<OrderData>(), null, 2));
338
+ console.log("History length:", persistentAgent.session.getHistory().length);
339
+ console.log("Session automatically saved to persistence ✓");
340
+
341
+ // Simulate server restart - create new agent instance with same sessionId
342
+ console.log("\n🔄 Simulating server restart - creating new agent instance...");
343
+
344
+ const restoredAgent = new Agent<OrderContext>({
345
+ name: "Order Assistant",
346
+ provider: new GeminiProvider({
347
+ apiKey: process.env.GEMINI_API_KEY!,
348
+ model: "models/gemini-2.5-flash",
349
+ }),
350
+ context: {
351
+ userId: "user_alice",
352
+ userName: "Alice",
353
+ isVip: false,
354
+ },
355
+ persistence: {
356
+ adapter: new MemoryAdapter(), // Same adapter instance for demo
357
+ autoSave: true,
358
+ },
359
+ sessionId, // Same sessionId - automatically loads existing session
360
+ });
361
+
362
+ // Copy routes to the restored agent
363
+ agent.getRoutes().forEach(route => {
364
+ restoredAgent.createRoute(route);
365
+ });
366
+
367
+ console.log("Session automatically restored:");
368
+ console.log("- Session ID:", restoredAgent.session.id);
369
+ console.log("- History length:", restoredAgent.session.getHistory().length);
370
+ console.log("- Restored data:", JSON.stringify(restoredAgent.session.getData<OrderData>(), null, 2));
371
+
372
+ // Continue conversation seamlessly
373
+ const response2 = await restoredAgent.chat("Actually, make it urgent delivery");
374
+
375
+ console.log("\nAfter continuing with restored session:");
376
+ console.log("🤖 Agent:", response2.message);
377
+ console.log("Session data:", JSON.stringify(restoredAgent.session.getData<OrderData>(), null, 2));
378
+ console.log("History length:", restoredAgent.session.getHistory().length);
379
+ console.log("Session automatically saved again ✓");
380
+ }
381
+
382
+ // Run demonstrations
383
+ async function main() {
384
+ try {
385
+ await demonstrateSessionManagement();
386
+ await demonstrateSessionPersistence();
387
+ } catch (error) {
388
+ console.error("Error:", error);
389
+ }
390
+ }
391
+
392
+ if (import.meta.url === `file://${process.argv[1]}`) {
393
+ main().catch(console.error);
394
+ }