@falai/agent 1.2.8 → 2.0.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 (522) hide show
  1. package/README.md +40 -886
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1191 -1014
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +509 -136
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
  126. package/dist/cjs/providers/AnthropicProvider.js +1 -1
  127. package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
  128. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  129. package/dist/cjs/providers/GeminiProvider.js +1 -1
  130. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  131. package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
  132. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  133. package/dist/cjs/providers/OpenAIProvider.js +1 -1
  134. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  135. package/dist/cjs/types/agent.d.ts +183 -54
  136. package/dist/cjs/types/agent.d.ts.map +1 -1
  137. package/dist/cjs/types/agent.js +0 -6
  138. package/dist/cjs/types/agent.js.map +1 -1
  139. package/dist/cjs/types/ai.d.ts +3 -3
  140. package/dist/cjs/types/ai.d.ts.map +1 -1
  141. package/dist/cjs/types/errors.d.ts +15 -0
  142. package/dist/cjs/types/errors.d.ts.map +1 -0
  143. package/dist/cjs/types/errors.js +22 -0
  144. package/dist/cjs/types/errors.js.map +1 -0
  145. package/dist/cjs/types/flow.d.ts +513 -0
  146. package/dist/cjs/types/flow.d.ts.map +1 -0
  147. package/dist/cjs/types/{route.js → flow.js} +2 -2
  148. package/dist/cjs/types/flow.js.map +1 -0
  149. package/dist/cjs/types/index.d.ts +7 -6
  150. package/dist/cjs/types/index.d.ts.map +1 -1
  151. package/dist/cjs/types/index.js +6 -2
  152. package/dist/cjs/types/index.js.map +1 -1
  153. package/dist/cjs/types/persistence.d.ts +11 -7
  154. package/dist/cjs/types/persistence.d.ts.map +1 -1
  155. package/dist/cjs/types/routing.d.ts +1 -1
  156. package/dist/cjs/types/routing.d.ts.map +1 -1
  157. package/dist/cjs/types/session.d.ts +24 -23
  158. package/dist/cjs/types/session.d.ts.map +1 -1
  159. package/dist/cjs/types/signals.d.ts +248 -0
  160. package/dist/cjs/types/signals.d.ts.map +1 -0
  161. package/dist/cjs/types/signals.js +11 -0
  162. package/dist/cjs/types/signals.js.map +1 -0
  163. package/dist/cjs/types/template.d.ts +2 -8
  164. package/dist/cjs/types/template.d.ts.map +1 -1
  165. package/dist/cjs/types/tool.d.ts +36 -29
  166. package/dist/cjs/types/tool.d.ts.map +1 -1
  167. package/dist/cjs/types/tool.js +1 -1
  168. package/dist/cjs/types/tool.js.map +1 -1
  169. package/dist/cjs/utils/condition.d.ts +7 -1
  170. package/dist/cjs/utils/condition.d.ts.map +1 -1
  171. package/dist/cjs/utils/condition.js.map +1 -1
  172. package/dist/cjs/utils/id.d.ts +13 -5
  173. package/dist/cjs/utils/id.d.ts.map +1 -1
  174. package/dist/cjs/utils/id.js +24 -10
  175. package/dist/cjs/utils/id.js.map +1 -1
  176. package/dist/cjs/utils/index.d.ts +2 -2
  177. package/dist/cjs/utils/index.d.ts.map +1 -1
  178. package/dist/cjs/utils/index.js +7 -3
  179. package/dist/cjs/utils/index.js.map +1 -1
  180. package/dist/cjs/utils/session.d.ts +44 -5
  181. package/dist/cjs/utils/session.d.ts.map +1 -1
  182. package/dist/cjs/utils/session.js +197 -38
  183. package/dist/cjs/utils/session.js.map +1 -1
  184. package/dist/constants/index.d.ts +0 -9
  185. package/dist/constants/index.d.ts.map +1 -1
  186. package/dist/constants/index.js +3 -9
  187. package/dist/constants/index.js.map +1 -1
  188. package/dist/core/Agent.d.ts +119 -153
  189. package/dist/core/Agent.d.ts.map +1 -1
  190. package/dist/core/Agent.js +472 -325
  191. package/dist/core/Agent.js.map +1 -1
  192. package/dist/core/AutoChainExecutor.d.ts +107 -0
  193. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  194. package/dist/core/AutoChainExecutor.js +293 -0
  195. package/dist/core/AutoChainExecutor.js.map +1 -0
  196. package/dist/core/BranchEvaluator.d.ts +54 -0
  197. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  198. package/dist/core/BranchEvaluator.js +126 -0
  199. package/dist/core/BranchEvaluator.js.map +1 -0
  200. package/dist/core/DirectiveBus.d.ts +88 -0
  201. package/dist/core/DirectiveBus.d.ts.map +1 -0
  202. package/dist/core/DirectiveBus.js +192 -0
  203. package/dist/core/DirectiveBus.js.map +1 -0
  204. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  205. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  206. package/dist/core/DirectiveChainTracker.js +117 -0
  207. package/dist/core/DirectiveChainTracker.js.map +1 -0
  208. package/dist/core/Flow.d.ts +186 -0
  209. package/dist/core/Flow.d.ts.map +1 -0
  210. package/dist/core/Flow.js +546 -0
  211. package/dist/core/Flow.js.map +1 -0
  212. package/dist/core/FlowRouter.d.ts +182 -0
  213. package/dist/core/FlowRouter.d.ts.map +1 -0
  214. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  215. package/dist/core/FlowRouter.js.map +1 -0
  216. package/dist/core/PersistenceManager.d.ts +2 -2
  217. package/dist/core/PersistenceManager.d.ts.map +1 -1
  218. package/dist/core/PersistenceManager.js +7 -7
  219. package/dist/core/PersistenceManager.js.map +1 -1
  220. package/dist/core/PromptComposer.d.ts +21 -8
  221. package/dist/core/PromptComposer.d.ts.map +1 -1
  222. package/dist/core/PromptComposer.js +183 -106
  223. package/dist/core/PromptComposer.js.map +1 -1
  224. package/dist/core/PromptSectionCache.d.ts +1 -1
  225. package/dist/core/PromptSectionCache.js +1 -1
  226. package/dist/core/ResponseEngine.d.ts +18 -8
  227. package/dist/core/ResponseEngine.d.ts.map +1 -1
  228. package/dist/core/ResponseEngine.js +38 -36
  229. package/dist/core/ResponseEngine.js.map +1 -1
  230. package/dist/core/ResponseModal.d.ts +73 -56
  231. package/dist/core/ResponseModal.d.ts.map +1 -1
  232. package/dist/core/ResponseModal.js +1193 -1016
  233. package/dist/core/ResponseModal.js.map +1 -1
  234. package/dist/core/ResponsePipeline.d.ts +124 -26
  235. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  236. package/dist/core/ResponsePipeline.js +509 -137
  237. package/dist/core/ResponsePipeline.js.map +1 -1
  238. package/dist/core/SignalEvaluator.d.ts +86 -0
  239. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  240. package/dist/core/SignalEvaluator.js +326 -0
  241. package/dist/core/SignalEvaluator.js.map +1 -0
  242. package/dist/core/SignalProcessor.d.ts +152 -0
  243. package/dist/core/SignalProcessor.d.ts.map +1 -0
  244. package/dist/core/SignalProcessor.js +555 -0
  245. package/dist/core/SignalProcessor.js.map +1 -0
  246. package/dist/core/Step.d.ts +43 -32
  247. package/dist/core/Step.d.ts.map +1 -1
  248. package/dist/core/Step.js +220 -126
  249. package/dist/core/Step.js.map +1 -1
  250. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  251. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  252. package/dist/core/StreamingToolExecutor.js.map +1 -1
  253. package/dist/core/ToolManager.d.ts +44 -13
  254. package/dist/core/ToolManager.d.ts.map +1 -1
  255. package/dist/core/ToolManager.js +174 -91
  256. package/dist/core/ToolManager.js.map +1 -1
  257. package/dist/core/createAgent.d.ts +35 -0
  258. package/dist/core/createAgent.d.ts.map +1 -0
  259. package/dist/core/createAgent.js +36 -0
  260. package/dist/core/createAgent.js.map +1 -0
  261. package/dist/core/flow-namespace.d.ts +49 -0
  262. package/dist/core/flow-namespace.d.ts.map +1 -0
  263. package/dist/core/flow-namespace.js +168 -0
  264. package/dist/core/flow-namespace.js.map +1 -0
  265. package/dist/index.d.ts +11 -14
  266. package/dist/index.d.ts.map +1 -1
  267. package/dist/index.js +9 -12
  268. package/dist/index.js.map +1 -1
  269. package/dist/providers/AnthropicProvider.d.ts +1 -1
  270. package/dist/providers/AnthropicProvider.js +1 -1
  271. package/dist/providers/GeminiProvider.d.ts +1 -1
  272. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  273. package/dist/providers/GeminiProvider.js +1 -1
  274. package/dist/providers/GeminiProvider.js.map +1 -1
  275. package/dist/providers/OpenAIProvider.d.ts +1 -1
  276. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  277. package/dist/providers/OpenAIProvider.js +1 -1
  278. package/dist/providers/OpenAIProvider.js.map +1 -1
  279. package/dist/types/agent.d.ts +183 -54
  280. package/dist/types/agent.d.ts.map +1 -1
  281. package/dist/types/agent.js +0 -6
  282. package/dist/types/agent.js.map +1 -1
  283. package/dist/types/ai.d.ts +3 -3
  284. package/dist/types/ai.d.ts.map +1 -1
  285. package/dist/types/errors.d.ts +15 -0
  286. package/dist/types/errors.d.ts.map +1 -0
  287. package/dist/types/errors.js +18 -0
  288. package/dist/types/errors.js.map +1 -0
  289. package/dist/types/flow.d.ts +513 -0
  290. package/dist/types/flow.d.ts.map +1 -0
  291. package/dist/types/flow.js +5 -0
  292. package/dist/types/flow.js.map +1 -0
  293. package/dist/types/index.d.ts +7 -6
  294. package/dist/types/index.d.ts.map +1 -1
  295. package/dist/types/index.js +4 -1
  296. package/dist/types/index.js.map +1 -1
  297. package/dist/types/persistence.d.ts +11 -7
  298. package/dist/types/persistence.d.ts.map +1 -1
  299. package/dist/types/routing.d.ts +1 -1
  300. package/dist/types/routing.d.ts.map +1 -1
  301. package/dist/types/session.d.ts +24 -23
  302. package/dist/types/session.d.ts.map +1 -1
  303. package/dist/types/signals.d.ts +248 -0
  304. package/dist/types/signals.d.ts.map +1 -0
  305. package/dist/types/signals.js +10 -0
  306. package/dist/types/signals.js.map +1 -0
  307. package/dist/types/template.d.ts +2 -8
  308. package/dist/types/template.d.ts.map +1 -1
  309. package/dist/types/tool.d.ts +36 -29
  310. package/dist/types/tool.d.ts.map +1 -1
  311. package/dist/types/tool.js +1 -1
  312. package/dist/types/tool.js.map +1 -1
  313. package/dist/utils/condition.d.ts +7 -1
  314. package/dist/utils/condition.d.ts.map +1 -1
  315. package/dist/utils/condition.js.map +1 -1
  316. package/dist/utils/id.d.ts +13 -5
  317. package/dist/utils/id.d.ts.map +1 -1
  318. package/dist/utils/id.js +22 -9
  319. package/dist/utils/id.js.map +1 -1
  320. package/dist/utils/index.d.ts +2 -2
  321. package/dist/utils/index.d.ts.map +1 -1
  322. package/dist/utils/index.js +2 -2
  323. package/dist/utils/index.js.map +1 -1
  324. package/dist/utils/session.d.ts +44 -5
  325. package/dist/utils/session.d.ts.map +1 -1
  326. package/dist/utils/session.js +193 -37
  327. package/dist/utils/session.js.map +1 -1
  328. package/docs/README.md +22 -200
  329. package/docs/concepts/architecture.md +281 -0
  330. package/docs/concepts/directives.md +400 -0
  331. package/docs/concepts/pipeline.md +399 -0
  332. package/docs/guides/branching.md +263 -0
  333. package/docs/guides/compaction.md +163 -0
  334. package/docs/guides/conditions.md +167 -0
  335. package/docs/guides/error-handling.md +176 -0
  336. package/docs/guides/flow-control.md +409 -0
  337. package/docs/guides/instructions.md +210 -0
  338. package/docs/guides/persistence.md +182 -0
  339. package/docs/guides/streaming.md +137 -0
  340. package/docs/migration/README.md +14 -0
  341. package/docs/migration/route-to-flow.md +561 -0
  342. package/docs/migration/v1-to-v2.md +909 -0
  343. package/docs/reference/adapters.md +481 -0
  344. package/docs/reference/branches.md +241 -0
  345. package/docs/reference/create-agent.md +186 -0
  346. package/docs/reference/directive.md +243 -0
  347. package/docs/reference/errors.md +122 -0
  348. package/docs/reference/flow.md +238 -0
  349. package/docs/reference/instruction.md +177 -0
  350. package/docs/reference/pre-directive.md +131 -0
  351. package/docs/reference/providers.md +227 -0
  352. package/docs/reference/signals.md +356 -0
  353. package/docs/reference/step.md +339 -0
  354. package/docs/reference/tool.md +269 -0
  355. package/docs/start/01-install.md +81 -0
  356. package/docs/start/02-first-agent.md +196 -0
  357. package/docs/start/03-collect-data.md +222 -0
  358. package/docs/start/04-add-tools.md +276 -0
  359. package/docs/start/05-go-to-production.md +216 -0
  360. package/examples/01-quickstart.ts +20 -0
  361. package/examples/02-data-extraction.ts +90 -0
  362. package/examples/03-tools.ts +136 -0
  363. package/examples/04-instructions.ts +100 -0
  364. package/examples/05-branching.ts +140 -0
  365. package/examples/06-flow-control.ts +103 -0
  366. package/examples/07-streaming.ts +69 -0
  367. package/examples/08-persistence.ts +98 -0
  368. package/examples/09-signals.ts +144 -0
  369. package/examples/tsconfig.json +30 -0
  370. package/package.json +2 -1
  371. package/src/adapters/MemoryAdapter.ts +3 -3
  372. package/src/adapters/MongoAdapter.ts +3 -3
  373. package/src/adapters/OpenSearchAdapter.ts +10 -8
  374. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  375. package/src/adapters/PrismaAdapter.ts +6 -6
  376. package/src/adapters/RedisAdapter.ts +3 -3
  377. package/src/adapters/SQLiteAdapter.ts +31 -12
  378. package/src/constants/index.ts +2 -10
  379. package/src/core/Agent.ts +585 -374
  380. package/src/core/AutoChainExecutor.ts +440 -0
  381. package/src/core/BranchEvaluator.ts +167 -0
  382. package/src/core/DirectiveBus.ts +248 -0
  383. package/src/core/DirectiveChainTracker.ts +144 -0
  384. package/src/core/Flow.ts +666 -0
  385. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  386. package/src/core/PersistenceManager.ts +8 -8
  387. package/src/core/PromptComposer.ts +209 -140
  388. package/src/core/PromptSectionCache.ts +1 -1
  389. package/src/core/ResponseEngine.ts +61 -46
  390. package/src/core/ResponseModal.ts +1453 -1240
  391. package/src/core/ResponsePipeline.ts +655 -175
  392. package/src/core/SignalEvaluator.ts +420 -0
  393. package/src/core/SignalProcessor.ts +723 -0
  394. package/src/core/Step.ts +279 -176
  395. package/src/core/StreamingToolExecutor.ts +4 -4
  396. package/src/core/ToolManager.ts +200 -97
  397. package/src/core/createAgent.ts +40 -0
  398. package/src/core/flow-namespace.ts +219 -0
  399. package/src/index.ts +42 -36
  400. package/src/providers/AnthropicProvider.ts +2 -2
  401. package/src/providers/GeminiProvider.ts +2 -2
  402. package/src/providers/OpenAIProvider.ts +2 -2
  403. package/src/types/agent.ts +182 -53
  404. package/src/types/ai.ts +3 -3
  405. package/src/types/errors.ts +18 -0
  406. package/src/types/flow.ts +590 -0
  407. package/src/types/index.ts +43 -16
  408. package/src/types/persistence.ts +12 -8
  409. package/src/types/routing.ts +1 -1
  410. package/src/types/session.ts +26 -23
  411. package/src/types/signals.ts +321 -0
  412. package/src/types/template.ts +3 -11
  413. package/src/types/tool.ts +50 -42
  414. package/src/utils/condition.ts +13 -4
  415. package/src/utils/id.ts +27 -9
  416. package/src/utils/index.ts +6 -2
  417. package/src/utils/session.ts +238 -42
  418. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  419. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  420. package/dist/cjs/core/BatchExecutor.js +0 -861
  421. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  422. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  423. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  424. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  425. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  426. package/dist/cjs/core/Route.d.ts +0 -180
  427. package/dist/cjs/core/Route.d.ts.map +0 -1
  428. package/dist/cjs/core/Route.js +0 -542
  429. package/dist/cjs/core/Route.js.map +0 -1
  430. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  431. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  432. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  433. package/dist/cjs/types/route.d.ts +0 -336
  434. package/dist/cjs/types/route.d.ts.map +0 -1
  435. package/dist/cjs/types/route.js.map +0 -1
  436. package/dist/core/BatchExecutor.d.ts +0 -359
  437. package/dist/core/BatchExecutor.d.ts.map +0 -1
  438. package/dist/core/BatchExecutor.js +0 -856
  439. package/dist/core/BatchExecutor.js.map +0 -1
  440. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  441. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  442. package/dist/core/BatchPromptBuilder.js +0 -219
  443. package/dist/core/BatchPromptBuilder.js.map +0 -1
  444. package/dist/core/Route.d.ts +0 -180
  445. package/dist/core/Route.d.ts.map +0 -1
  446. package/dist/core/Route.js +0 -538
  447. package/dist/core/Route.js.map +0 -1
  448. package/dist/core/RoutingEngine.d.ts +0 -185
  449. package/dist/core/RoutingEngine.d.ts.map +0 -1
  450. package/dist/core/RoutingEngine.js.map +0 -1
  451. package/dist/types/route.d.ts +0 -336
  452. package/dist/types/route.d.ts.map +0 -1
  453. package/dist/types/route.js +0 -5
  454. package/dist/types/route.js.map +0 -1
  455. package/docs/CONTRIBUTING.md +0 -521
  456. package/docs/api/README.md +0 -3299
  457. package/docs/api/overview.md +0 -1410
  458. package/docs/architecture/data-extraction-flow.md +0 -360
  459. package/docs/architecture/multi-step-execution.md +0 -277
  460. package/docs/core/agent/README.md +0 -938
  461. package/docs/core/agent/context-management.md +0 -796
  462. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  463. package/docs/core/agent/session-management.md +0 -693
  464. package/docs/core/ai-integration/prompt-composition.md +0 -355
  465. package/docs/core/ai-integration/providers.md +0 -515
  466. package/docs/core/ai-integration/response-processing.md +0 -433
  467. package/docs/core/conversation-flows/data-collection.md +0 -772
  468. package/docs/core/conversation-flows/route-dsl.md +0 -509
  469. package/docs/core/conversation-flows/routes.md +0 -249
  470. package/docs/core/conversation-flows/step-transitions.md +0 -731
  471. package/docs/core/conversation-flows/steps.md +0 -268
  472. package/docs/core/error-handling.md +0 -830
  473. package/docs/core/persistence/adapters.md +0 -255
  474. package/docs/core/persistence/session-storage.md +0 -656
  475. package/docs/core/routing/intelligent-routing.md +0 -470
  476. package/docs/core/tools/enhanced-tool.md +0 -186
  477. package/docs/core/tools/streaming-execution.md +0 -161
  478. package/docs/core/tools/tool-definition.md +0 -970
  479. package/docs/core/tools/tool-scoping.md +0 -819
  480. package/docs/guides/advanced-patterns/publishing.md +0 -186
  481. package/docs/guides/context-compaction.md +0 -96
  482. package/docs/guides/error-handling-patterns.md +0 -578
  483. package/docs/guides/getting-started/README.md +0 -795
  484. package/docs/guides/migration/README.md +0 -101
  485. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  486. package/docs/guides/migration/multi-step-execution.md +0 -393
  487. package/docs/guides/migration/response-modal-refactor.md +0 -518
  488. package/docs/guides/prompt-optimization.md +0 -164
  489. package/examples/advanced-patterns/context-compaction.ts +0 -223
  490. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  491. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  492. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  493. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  494. package/examples/ai-providers/anthropic-integration.ts +0 -388
  495. package/examples/ai-providers/openai-integration.ts +0 -228
  496. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  497. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  498. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  499. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  500. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  501. package/examples/conversation-flows/completion-transitions.ts +0 -318
  502. package/examples/core-concepts/basic-agent.ts +0 -503
  503. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  504. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  505. package/examples/core-concepts/session-management.ts +0 -494
  506. package/examples/integrations/database-integration.ts +0 -631
  507. package/examples/integrations/healthcare-integration.ts +0 -595
  508. package/examples/integrations/search-integration.ts +0 -530
  509. package/examples/integrations/server-session-management.ts +0 -307
  510. package/examples/persistence/custom-adapter.ts +0 -526
  511. package/examples/persistence/database-persistence.ts +0 -583
  512. package/examples/persistence/memory-sessions.ts +0 -495
  513. package/examples/persistence/prisma-schema.example.prisma +0 -74
  514. package/examples/persistence/redis-persistence.ts +0 -488
  515. package/examples/tools/basic-tools.ts +0 -765
  516. package/examples/tools/data-enrichment-tools.ts +0 -593
  517. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  518. package/examples/tools/streaming-tool-execution.ts +0 -283
  519. package/src/core/BatchExecutor.ts +0 -1187
  520. package/src/core/BatchPromptBuilder.ts +0 -299
  521. package/src/core/Route.ts +0 -678
  522. package/src/types/route.ts +0 -392
@@ -1,728 +0,0 @@
1
- /**
2
- * Persistent multi-turn onboarding agent example
3
- * Updated for v2 architecture with session step management and schema-first data extraction
4
- *
5
- * NEW: Enhanced with flexible ConditionTemplate patterns:
6
- * - Mixed route conditions: ["AI context", (ctx) => state_check]
7
- * - Route skipIf: Skip if onboarding already complete
8
- * - Step skipIf: Enhanced conditional step skipping with AI context
9
- * - Programmatic when conditions: (ctx) => data_validation
10
- * - Performance patterns for condition evaluation
11
- */
12
-
13
- import {
14
- Agent,
15
- type Tool,
16
- GeminiProvider,
17
- END_ROUTE,
18
- } from "../../src";
19
-
20
- // ============================================================================
21
- // DATABASE SIMULATION
22
- // ============================================================================
23
-
24
- interface SessionData {
25
- sessionId: string;
26
- userId: string;
27
- collectedData: {
28
- businessName?: string;
29
- businessDescription?: string;
30
- industry?: string;
31
- contactEmail?: string;
32
- };
33
- completedSteps: string[];
34
- lastUpdated: Date;
35
- }
36
-
37
- // Simple in-memory database simulation
38
- const database = new Map<string, SessionData>();
39
-
40
- const db = {
41
- sessions: {
42
- findById(sessionId: string): SessionData | undefined {
43
- return database.get(sessionId);
44
- },
45
-
46
- update(sessionId: string, updates: Partial<SessionData>): void {
47
- const existing = database.get(sessionId);
48
- if (existing) {
49
- database.set(sessionId, {
50
- ...existing,
51
- ...updates,
52
- lastUpdated: new Date(),
53
- });
54
- }
55
- },
56
-
57
- create(sessionData: SessionData): void {
58
- database.set(sessionData.sessionId, sessionData);
59
- },
60
- },
61
- };
62
-
63
- // ============================================================================
64
- // CONTEXT TYPE
65
- // ============================================================================
66
-
67
- // Data extraction types for onboarding
68
- interface OnboardingData {
69
- businessName?: string;
70
- businessDescription?: string;
71
- industry?: string;
72
- contactEmail?: string;
73
- }
74
-
75
- interface OnboardingContext {
76
- sessionId: string;
77
- userId: string;
78
- userName?: string;
79
- collectedData: OnboardingData;
80
- completedSteps: string[];
81
- }
82
-
83
- // ============================================================================
84
- // AGENT FACTORY WITH LIFECYCLE HOOKS
85
- // ============================================================================
86
-
87
- /**
88
- * Creates an onboarding agent with persistent context management
89
- *
90
- * PATTERN 1: Factory + Lifecycle Hooks
91
- * - Load fresh context from database before each response
92
- * - Persist context updates automatically after changes
93
- */
94
- function createPersistentOnboardingAgent(sessionId: string) {
95
- // Load session from database
96
- const session = db.sessions.findById(sessionId);
97
-
98
- if (!session) {
99
- throw new Error(`Session ${sessionId} not found`);
100
- }
101
-
102
- // Define lifecycle hooks for automatic persistence
103
- const hooks = {
104
- // Called after data extraction - validate and enrich collected data
105
- onDataUpdate: (data: Partial<OnboardingData>) => {
106
- console.log("šŸ”„ Processing collected data...");
107
-
108
- // Update completed steps based on what's been data
109
- const completedSteps: string[] = [];
110
- if (data.businessName) completedSteps.push("business_info");
111
- if (data.businessDescription) completedSteps.push("business_description");
112
- if (data.industry) completedSteps.push("industry");
113
- if (data.contactEmail) completedSteps.push("contact");
114
-
115
- // Persist to database
116
- db.sessions.update(sessionId, {
117
- collectedData: data,
118
- completedSteps,
119
- });
120
-
121
- return data;
122
- },
123
- };
124
-
125
- const provider = new GeminiProvider({
126
- apiKey: process.env.GEMINI_API_KEY || "test-key",
127
- model: "models/gemini-2.5-flash",
128
- });
129
-
130
- // Define the onboarding schema
131
- const onboardingSchema = {
132
- type: "object",
133
- properties: {
134
- businessName: {
135
- type: "string",
136
- description: "Name of the business",
137
- },
138
- businessDescription: {
139
- type: "string",
140
- description: "Brief description of what the business does",
141
- },
142
- industry: {
143
- type: "string",
144
- description: "Industry the business operates in",
145
- },
146
- contactEmail: {
147
- type: "string",
148
- description: "Contact email for the business",
149
- },
150
- },
151
- required: ["businessName", "businessDescription"],
152
- };
153
-
154
- const agent = new Agent<OnboardingContext, OnboardingData>({
155
- name: "OnboardingBot",
156
- description: "A friendly assistant that helps businesses get started",
157
- goal: "Collect business information efficiently while being conversational",
158
- provider: provider,
159
- // NEW: Agent-level schema
160
- schema: onboardingSchema,
161
-
162
- // Knowledge base with onboarding best practices
163
- knowledgeBase: {
164
- onboardingFlow: {
165
- stages: [
166
- "Business identification",
167
- "Industry classification",
168
- "Contact information collection",
169
- "Verification and confirmation",
170
- ],
171
- averageCompletion: "3-5 minutes",
172
- dropOffPoints: ["Contact email collection", "Industry classification"],
173
- },
174
- businessTypes: {
175
- retail: {
176
- commonIndustries: [
177
- "Fashion",
178
- "Electronics",
179
- "Home goods",
180
- "Food service",
181
- ],
182
- keyQuestions: ["Store location", "Target customers", "Peak hours"],
183
- },
184
- professional: {
185
- commonIndustries: ["Consulting", "Legal", "Accounting", "Healthcare"],
186
- keyQuestions: ["Service areas", "Certifications", "Client types"],
187
- },
188
- manufacturing: {
189
- commonIndustries: [
190
- "Electronics",
191
- "Automotive",
192
- "Food processing",
193
- "Textiles",
194
- ],
195
- keyQuestions: [
196
- "Production capacity",
197
- "Supply chain",
198
- "Quality standards",
199
- ],
200
- },
201
- },
202
- dataValidation: {
203
- email: "Must contain @ symbol and valid domain",
204
- businessName: "2-100 characters, no special characters",
205
- description: "10-500 characters, describes what the business does",
206
- },
207
- completionCriteria: [
208
- "Business name provided",
209
- "Business description provided",
210
- "Industry category selected",
211
- "Valid contact email provided",
212
- ],
213
- },
214
- // Context is loaded fresh from database on each respond() call
215
- contextProvider: () => {
216
- console.log("šŸ”„ Loading fresh context from database...");
217
- const freshSession = db.sessions.findById(sessionId);
218
-
219
- if (!freshSession) {
220
- throw new Error(`Session ${sessionId} not found`);
221
- }
222
-
223
- return {
224
- sessionId: freshSession.sessionId,
225
- userId: freshSession.userId,
226
- collectedData: freshSession.collectedData,
227
- completedSteps: freshSession.completedSteps,
228
- };
229
- },
230
- hooks, // Enable lifecycle hooks for persistence
231
- });
232
-
233
- // ============================================================================
234
- // TOOLS (with context updates)
235
- // ============================================================================
236
-
237
- // OPTION 1: Using contextUpdate in return value
238
- const saveBusinessInfo: Tool<OnboardingContext, OnboardingData> = {
239
- id: "save_business_info",
240
- name: "Business Info Saver",
241
- description: "Save business name and description",
242
- parameters: {
243
- type: "object",
244
- properties: {
245
- name: { type: "string", description: "Business name" },
246
- description: { type: "string", description: "Business description" },
247
- },
248
- required: ["name", "description"],
249
- },
250
- handler: (toolContext, args) => {
251
- const name = args?.name as string;
252
- const description = args?.description as string;
253
- console.log(`šŸ“ Saving business info: ${name}`);
254
-
255
- return {
256
- data: "Business information saved successfully",
257
- // Context update is automatically persisted via onContextUpdate hook
258
- contextUpdate: {
259
- collectedData: {
260
- ...toolContext.context.collectedData,
261
- businessName: name,
262
- businessDescription: description,
263
- },
264
- completedSteps: [
265
- ...toolContext.context.completedSteps,
266
- "business_info",
267
- ],
268
- },
269
- };
270
- },
271
- };
272
-
273
- // OPTION 2: Using contextUpdate in return value
274
- const saveIndustry: Tool<OnboardingContext, OnboardingData> = {
275
- id: "save_industry",
276
- name: "Industry Classifier",
277
- description: "Save business industry",
278
- parameters: {
279
- type: "object",
280
- properties: {
281
- industry: { type: "string", description: "Business industry" },
282
- },
283
- required: ["industry"],
284
- },
285
- handler: async (toolContext, args) => {
286
- const industry = args?.industry as string;
287
- console.log(`šŸ­ Saving industry: ${industry}`);
288
-
289
- return {
290
- data: "Industry information saved successfully",
291
- contextUpdate: {
292
- collectedData: {
293
- ...toolContext.context.collectedData,
294
- industry,
295
- },
296
- completedSteps: [...toolContext.context.completedSteps, "industry"],
297
- },
298
- };
299
- },
300
- };
301
-
302
- const saveContactEmail: Tool<OnboardingContext, OnboardingData> = {
303
- id: "save_contact_email",
304
- name: "Contact Email Saver",
305
- description: "Save contact email",
306
- parameters: {
307
- type: "object",
308
- properties: {
309
- email: { type: "string", description: "Contact email address" },
310
- },
311
- required: ["email"],
312
- },
313
- handler: async (toolContext, args) => {
314
- const email = args?.email as string;
315
- console.log(`šŸ“§ Saving contact email: ${email}`);
316
-
317
- return {
318
- data: "Contact email saved successfully",
319
- contextUpdate: {
320
- collectedData: {
321
- ...toolContext.context.collectedData,
322
- contactEmail: email,
323
- },
324
- completedSteps: [...toolContext.context.completedSteps, "contact"],
325
- },
326
- };
327
- },
328
- };
329
-
330
- // ============================================================================
331
- // ONBOARDING ROUTE WITH DATA EXTRACTION
332
- // ============================================================================
333
-
334
- const onboardingRoute = agent.createRoute({
335
- title: "Business Onboarding",
336
- description: "Guide user through business information collection",
337
- // Mixed condition: AI context + programmatic validation
338
- when: [
339
- "User is onboarding their business",
340
- (ctx) => {
341
- const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
342
- return message.includes('onboard') || message.includes('register') ||
343
- message.includes('business') || message.includes('start');
344
- }
345
- ],
346
- // Skip if user already has complete business info
347
- skipIf: [
348
- "business information already complete",
349
- (ctx) => {
350
- const data = ctx.data;
351
- return !!(data?.businessName && data?.businessDescription &&
352
- data?.industry && data?.contactEmail);
353
- }
354
- ],
355
- // NEW: Required fields for route completion
356
- requiredFields: ["businessName", "businessDescription"],
357
- // NEW: Optional fields that enhance the experience
358
- optionalFields: ["industry", "contactEmail"],
359
- endStep: {
360
- prompt:
361
- "Summarize all collected information warmly and confirm onboarding is complete",
362
- },
363
- });
364
-
365
- // Step 1: Collect business name and description
366
- const collectBusinessInfo = onboardingRoute.initialStep.nextStep({
367
- prompt: "Ask for business name and a brief description",
368
- collect: ["businessName", "businessDescription"],
369
- // Mixed skipIf: AI context + programmatic check
370
- skipIf: [
371
- "business name and description already provided",
372
- (ctx) => !!ctx.data?.businessName && !!ctx.data.businessDescription
373
- ],
374
- // String-only when condition for AI context
375
- when: "Need to collect basic business information first",
376
- });
377
-
378
- // Step 2: Save business info (tool execution)
379
- const saveBusiness = collectBusinessInfo.nextStep({
380
- tools: [saveBusinessInfo],
381
- requires: ["businessName", "businessDescription"],
382
- // Function-only when condition for programmatic logic
383
- when: (ctx) => !!ctx.data?.businessName && !!ctx.data?.businessDescription,
384
- });
385
-
386
- // Step 3: Collect industry
387
- const collectIndustry = saveBusiness.nextStep({
388
- prompt: "Ask what industry the business operates in",
389
- collect: ["industry"],
390
- // Mixed skipIf: AI context + programmatic logic
391
- skipIf: [
392
- "industry already specified",
393
- (ctx) => !!ctx.data?.industry
394
- ],
395
- });
396
-
397
- // Step 4: Save industry (tool execution)
398
- const saveIndustryStep = collectIndustry.nextStep({
399
- tools: [saveIndustry],
400
- requires: ["industry"],
401
- });
402
-
403
- // Step 5: Collect contact email
404
- const collectContact = saveIndustryStep.nextStep({
405
- prompt: "Ask for their contact email",
406
- collect: ["contactEmail"],
407
- // Function-only skipIf for programmatic check
408
- skipIf: (ctx) => !!ctx.data?.contactEmail,
409
- });
410
-
411
- // Step 6: Save contact (tool execution)
412
- const saveContact = collectContact.nextStep({
413
- tools: [saveContactEmail],
414
- requires: ["contactEmail"],
415
- });
416
-
417
- // Step 7: Confirmation - uses route-level endStep
418
- saveContact.nextStep({ step: END_ROUTE });
419
-
420
- // Guidelines
421
- onboardingRoute.createGuideline({
422
- condition: "User provides invalid email format",
423
- action: "Politely ask for a valid email address",
424
- tags: ["validation"],
425
- });
426
-
427
- onboardingRoute.createGuideline({
428
- condition: "User wants to skip a step",
429
- action: "Explain why the information is important but allow them to skip",
430
- tags: ["flexibility"],
431
- });
432
-
433
- agent.createGuideline({
434
- condition: "User asks to start over",
435
- action:
436
- "Confirm they want to clear their progress, then restart the onboarding",
437
- tags: ["reset"],
438
- });
439
-
440
- return agent;
441
- }
442
-
443
- // ============================================================================
444
- // ALTERNATIVE PATTERN: CONTEXT PROVIDER
445
- // ============================================================================
446
-
447
- /**
448
- * Creates an onboarding agent using the contextProvider pattern
449
- *
450
- * PATTERN 2: Context Provider (Always Fresh)
451
- * - Context is fetched fresh on every respond() call
452
- * - No need for beforeRespond hook
453
- * - Still use onContextUpdate for persistence
454
- */
455
- function createOnboardingAgentWithProvider(sessionId: string) {
456
- const provider = new GeminiProvider({
457
- apiKey: process.env.GEMINI_API_KEY || "test-key",
458
- model: "models/gemini-2.5-flash",
459
- });
460
-
461
- // Define the onboarding schema
462
- const onboardingSchema = {
463
- type: "object",
464
- properties: {
465
- businessName: {
466
- type: "string",
467
- description: "Name of the business",
468
- },
469
- businessDescription: {
470
- type: "string",
471
- description: "Brief description of what the business does",
472
- },
473
- industry: {
474
- type: "string",
475
- description: "Industry the business operates in",
476
- },
477
- contactEmail: {
478
- type: "string",
479
- description: "Contact email for the business",
480
- },
481
- },
482
- required: ["businessName", "businessDescription"],
483
- };
484
-
485
- const agent = new Agent<OnboardingContext, OnboardingData>({
486
- name: "OnboardingBot",
487
- description: "A friendly assistant that helps businesses get started",
488
- provider: provider,
489
- // NEW: Agent-level schema
490
- schema: onboardingSchema,
491
-
492
- // Context is always fetched fresh from database
493
- contextProvider: () => {
494
- const session = db.sessions.findById(sessionId);
495
- if (!session) {
496
- throw new Error(`Session ${sessionId} not found`);
497
- }
498
-
499
- return {
500
- sessionId: session.sessionId,
501
- userId: session.userId,
502
- collectedData: session.collectedData,
503
- completedSteps: session.completedSteps,
504
- };
505
- },
506
-
507
- // Still persist updates
508
- hooks: {
509
- onContextUpdate: (newContext) => {
510
- db.sessions.update(sessionId, {
511
- collectedData: newContext.collectedData,
512
- completedSteps: newContext.completedSteps,
513
- });
514
- },
515
- },
516
- });
517
-
518
- // ... rest of agent setup (same as above)
519
-
520
- return agent;
521
- }
522
-
523
- // ============================================================================
524
- // USAGE EXAMPLE
525
- // ============================================================================
526
-
527
- async function main() {
528
- const sessionId = "session_123";
529
- const userId = "user_456";
530
-
531
- // Initialize session in database
532
- db.sessions.create({
533
- sessionId,
534
- userId,
535
- collectedData: {},
536
- completedSteps: [],
537
- lastUpdated: new Date(),
538
- });
539
-
540
- // Create agent with fresh context loading
541
- const agent = createPersistentOnboardingAgent(sessionId);
542
-
543
- console.log("=== MULTI-TURN CONVERSATION SIMULATION ===\n");
544
-
545
- // Session is automatically managed by the agent
546
- console.log("✨ Session ready:", agent.session.id);
547
-
548
- // Turn 1: Start onboarding
549
- console.log("šŸ“± Turn 1: User starts onboarding");
550
-
551
- await agent.session.addMessage("user", "Hi, I want to onboard my business", "Alice");
552
-
553
- const response1 = await agent.respond({
554
- history: agent.session.getHistory(),
555
- });
556
-
557
- console.log("šŸ¤– Bot:", response1.message);
558
- console.log("šŸ“Š Data after turn 1:", agent.session.getData());
559
- console.log("šŸ“Š Route:", response1.session?.currentRoute?.title);
560
-
561
- // Check route completion after turn 1
562
- console.log("šŸ” Route Completion Check (Turn 1):");
563
- if (response1.isRouteComplete) {
564
- console.log(" āœ… Route completed after turn 1!");
565
- } else {
566
- console.log(" ā³ Route still in progress after turn 1");
567
- }
568
-
569
- console.log();
570
-
571
- await agent.session.addMessage("assistant", response1.message);
572
-
573
- // Turn 2: User provides business info
574
- console.log("šŸ“± Turn 2: User provides business info");
575
- const history2 = [
576
- {
577
- role: "user" as const,
578
- content: "Hi, I want to onboard my business",
579
- name: "Alice",
580
- },
581
- {
582
- role: "assistant" as const,
583
- content: response1.message,
584
- },
585
- {
586
- role: "user" as const,
587
- content:
588
- "My business is called 'TechFlow' and we build AI-powered workflow automation tools",
589
- name: "Alice",
590
- },
591
- ];
592
- const response2 = await agent.respond({ history: history2 });
593
- console.log("šŸ¤– Bot:", response2.message);
594
- console.log("šŸ“Š Data after turn 2:", response2.session?.data);
595
-
596
- // Check route completion after turn 2
597
- console.log("šŸ” Route Completion Check (Turn 2):");
598
- if (response2.isRouteComplete) {
599
- console.log(" āœ… Route completed after turn 2!");
600
- } else {
601
- console.log(" ā³ Route still in progress after turn 2");
602
- }
603
-
604
- console.log();
605
-
606
-
607
- // Turn 3: User provides industry
608
- console.log("šŸ“± Turn 3: User provides industry");
609
- const history3 = [
610
- ...history2,
611
- {
612
- role: "assistant" as const,
613
- content: response2.message,
614
- },
615
- {
616
- role: "user" as const,
617
- content: "We're in the SaaS industry",
618
- name: "Alice",
619
- },
620
- ];
621
- const response3 = await agent.respond({ history: history3 });
622
- console.log("šŸ¤– Bot:", response3.message);
623
- console.log("šŸ“Š Data after turn 3:", response3.session?.data);
624
-
625
- // Check route completion after turn 3
626
- console.log("šŸ” Route Completion Check (Turn 3):");
627
- if (response3.isRouteComplete) {
628
- console.log(" āœ… Route completed after turn 3!");
629
- } else {
630
- console.log(" ā³ Route still in progress after turn 3");
631
- }
632
-
633
- console.log();
634
-
635
- // Turn 4: User provides contact email, completing the flow
636
- console.log("šŸ“± Turn 4: User provides contact email");
637
- const history4 = [
638
- ...history3,
639
- {
640
- role: "assistant" as const,
641
- content: response3.message,
642
- },
643
- {
644
- role: "user" as const,
645
- content: "Our contact email is contact@techflow.ai",
646
- name: "Alice",
647
- },
648
- ];
649
- const response4 = await agent.respond({ history: history4 });
650
- console.log("šŸ¤– Bot:", response4.message);
651
- console.log("šŸ“Š Data after turn 4:", response4.session?.data);
652
-
653
- // Check for route completion
654
- if (response4.isRouteComplete) {
655
- console.log("\nāœ… Onboarding complete!");
656
- await finalizeOnboarding(
657
- agent.getData() as unknown as OnboardingData
658
- );
659
- }
660
-
661
- // Verify persistence
662
- console.log("=== PERSISTENCE VERIFICATION ===");
663
- const finalSession = db.sessions.findById(sessionId);
664
- console.log(
665
- "šŸ’¾ Final persisted session:",
666
- JSON.stringify(finalSession, null, 2)
667
- );
668
- }
669
-
670
- // ============================================================================
671
- // KEY PATTERNS DEMONSTRATED (V2 Architecture)
672
- // ============================================================================
673
-
674
- /*
675
- * āœ… PATTERN 1: Session Management (New SessionManager pattern)
676
- * - agent.session: Automatic session management
677
- * - agent.session.addMessage(): Add messages to history
678
- * - Session tracks collected data across turns
679
- * - Always-on routing respects intent changes
680
- *
681
- * āœ… PATTERN 2: Schema-First Data Extraction
682
- * - schema: Define data contracts upfront
683
- * - Type-safe extraction throughout conversation
684
- * - skipIf functions for deterministic step logic
685
- * - requires arrays for prerequisites
686
- *
687
- * āœ… PATTERN 3: Context Provider (For external data sources)
688
- * - contextProvider: Load fresh context from database/API
689
- * - Runs before each respond() call
690
- * - Perfect for real-time external data
691
- *
692
- * āœ… PATTERN 4: Lifecycle Hooks (Data validation & enrichment)
693
- * - onDataUpdate: Process collected data after extraction
694
- * - Validate, enrich, and persist collected data
695
- * - Return modified collected data
696
- *
697
- * āœ… PATTERN 5: Tool Integration (Enhanced context access)
698
- * - Tools access collected data via context parameter
699
- * - Can return dataUpdate to modify collected data
700
- * - Perfect for data validation and enrichment
701
- *
702
- * āœ… PATTERN 6: Step Progression (Code-based logic)
703
- * - skipIf: Deterministic functions instead of fuzzy conditions
704
- * - requires: Prerequisites for step transitions
705
- * - No more LLM interpretation of step logic
706
- */
707
-
708
- /**
709
- * Mock function to finalize the onboarding process.
710
- * @param data - The complete onboarding data.
711
- */
712
- async function finalizeOnboarding(data: OnboardingData) {
713
- console.log("\n" + "=".repeat(60));
714
- console.log("šŸš€ Finalizing Onboarding...");
715
- console.log("=".repeat(60));
716
- console.log("Onboarding Details:", JSON.stringify(data, null, 2));
717
- console.log(` - Sending welcome email to ${data.contactEmail}...`);
718
- await new Promise((resolve) => setTimeout(resolve, 1000));
719
- console.log(" - Scheduling follow-up call...");
720
- await new Promise((resolve) => setTimeout(resolve, 500));
721
- console.log("✨ Onboarding finalized!");
722
- }
723
-
724
- if (import.meta.url === `file://${process.argv[1]}`) {
725
- main().catch(console.error);
726
- }
727
-
728
- export { createPersistentOnboardingAgent, createOnboardingAgentWithProvider };