@falai/agent 1.2.7 → 2.0.0

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 (508) 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 +1196 -1015
  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 +524 -134
  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/GeminiProvider.d.ts +3 -3
  126. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  127. package/dist/cjs/providers/GeminiProvider.js +16 -14
  128. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  129. package/dist/cjs/types/agent.d.ts +183 -54
  130. package/dist/cjs/types/agent.d.ts.map +1 -1
  131. package/dist/cjs/types/agent.js +0 -6
  132. package/dist/cjs/types/agent.js.map +1 -1
  133. package/dist/cjs/types/ai.d.ts +3 -3
  134. package/dist/cjs/types/ai.d.ts.map +1 -1
  135. package/dist/cjs/types/errors.d.ts +15 -0
  136. package/dist/cjs/types/errors.d.ts.map +1 -0
  137. package/dist/cjs/types/errors.js +22 -0
  138. package/dist/cjs/types/errors.js.map +1 -0
  139. package/dist/cjs/types/flow.d.ts +513 -0
  140. package/dist/cjs/types/flow.d.ts.map +1 -0
  141. package/dist/cjs/types/{route.js → flow.js} +2 -2
  142. package/dist/cjs/types/flow.js.map +1 -0
  143. package/dist/cjs/types/index.d.ts +7 -6
  144. package/dist/cjs/types/index.d.ts.map +1 -1
  145. package/dist/cjs/types/index.js +6 -2
  146. package/dist/cjs/types/index.js.map +1 -1
  147. package/dist/cjs/types/persistence.d.ts +11 -7
  148. package/dist/cjs/types/persistence.d.ts.map +1 -1
  149. package/dist/cjs/types/routing.d.ts +1 -1
  150. package/dist/cjs/types/routing.d.ts.map +1 -1
  151. package/dist/cjs/types/session.d.ts +24 -23
  152. package/dist/cjs/types/session.d.ts.map +1 -1
  153. package/dist/cjs/types/signals.d.ts +248 -0
  154. package/dist/cjs/types/signals.d.ts.map +1 -0
  155. package/dist/cjs/types/signals.js +11 -0
  156. package/dist/cjs/types/signals.js.map +1 -0
  157. package/dist/cjs/types/template.d.ts +2 -8
  158. package/dist/cjs/types/template.d.ts.map +1 -1
  159. package/dist/cjs/types/tool.d.ts +36 -29
  160. package/dist/cjs/types/tool.d.ts.map +1 -1
  161. package/dist/cjs/types/tool.js +1 -1
  162. package/dist/cjs/types/tool.js.map +1 -1
  163. package/dist/cjs/utils/condition.d.ts +7 -1
  164. package/dist/cjs/utils/condition.d.ts.map +1 -1
  165. package/dist/cjs/utils/condition.js.map +1 -1
  166. package/dist/cjs/utils/id.d.ts +13 -5
  167. package/dist/cjs/utils/id.d.ts.map +1 -1
  168. package/dist/cjs/utils/id.js +24 -10
  169. package/dist/cjs/utils/id.js.map +1 -1
  170. package/dist/cjs/utils/index.d.ts +2 -2
  171. package/dist/cjs/utils/index.d.ts.map +1 -1
  172. package/dist/cjs/utils/index.js +7 -3
  173. package/dist/cjs/utils/index.js.map +1 -1
  174. package/dist/cjs/utils/session.d.ts +44 -5
  175. package/dist/cjs/utils/session.d.ts.map +1 -1
  176. package/dist/cjs/utils/session.js +197 -38
  177. package/dist/cjs/utils/session.js.map +1 -1
  178. package/dist/constants/index.d.ts +0 -9
  179. package/dist/constants/index.d.ts.map +1 -1
  180. package/dist/constants/index.js +3 -9
  181. package/dist/constants/index.js.map +1 -1
  182. package/dist/core/Agent.d.ts +119 -153
  183. package/dist/core/Agent.d.ts.map +1 -1
  184. package/dist/core/Agent.js +472 -325
  185. package/dist/core/Agent.js.map +1 -1
  186. package/dist/core/AutoChainExecutor.d.ts +107 -0
  187. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  188. package/dist/core/AutoChainExecutor.js +293 -0
  189. package/dist/core/AutoChainExecutor.js.map +1 -0
  190. package/dist/core/BranchEvaluator.d.ts +54 -0
  191. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  192. package/dist/core/BranchEvaluator.js +126 -0
  193. package/dist/core/BranchEvaluator.js.map +1 -0
  194. package/dist/core/DirectiveBus.d.ts +88 -0
  195. package/dist/core/DirectiveBus.d.ts.map +1 -0
  196. package/dist/core/DirectiveBus.js +192 -0
  197. package/dist/core/DirectiveBus.js.map +1 -0
  198. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  199. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  200. package/dist/core/DirectiveChainTracker.js +117 -0
  201. package/dist/core/DirectiveChainTracker.js.map +1 -0
  202. package/dist/core/Flow.d.ts +186 -0
  203. package/dist/core/Flow.d.ts.map +1 -0
  204. package/dist/core/Flow.js +546 -0
  205. package/dist/core/Flow.js.map +1 -0
  206. package/dist/core/FlowRouter.d.ts +182 -0
  207. package/dist/core/FlowRouter.d.ts.map +1 -0
  208. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  209. package/dist/core/FlowRouter.js.map +1 -0
  210. package/dist/core/PersistenceManager.d.ts +2 -2
  211. package/dist/core/PersistenceManager.d.ts.map +1 -1
  212. package/dist/core/PersistenceManager.js +7 -7
  213. package/dist/core/PersistenceManager.js.map +1 -1
  214. package/dist/core/PromptComposer.d.ts +21 -8
  215. package/dist/core/PromptComposer.d.ts.map +1 -1
  216. package/dist/core/PromptComposer.js +183 -106
  217. package/dist/core/PromptComposer.js.map +1 -1
  218. package/dist/core/PromptSectionCache.d.ts +1 -1
  219. package/dist/core/PromptSectionCache.js +1 -1
  220. package/dist/core/ResponseEngine.d.ts +18 -8
  221. package/dist/core/ResponseEngine.d.ts.map +1 -1
  222. package/dist/core/ResponseEngine.js +38 -36
  223. package/dist/core/ResponseEngine.js.map +1 -1
  224. package/dist/core/ResponseModal.d.ts +73 -56
  225. package/dist/core/ResponseModal.d.ts.map +1 -1
  226. package/dist/core/ResponseModal.js +1198 -1017
  227. package/dist/core/ResponseModal.js.map +1 -1
  228. package/dist/core/ResponsePipeline.d.ts +124 -26
  229. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  230. package/dist/core/ResponsePipeline.js +524 -135
  231. package/dist/core/ResponsePipeline.js.map +1 -1
  232. package/dist/core/SignalEvaluator.d.ts +86 -0
  233. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  234. package/dist/core/SignalEvaluator.js +326 -0
  235. package/dist/core/SignalEvaluator.js.map +1 -0
  236. package/dist/core/SignalProcessor.d.ts +152 -0
  237. package/dist/core/SignalProcessor.d.ts.map +1 -0
  238. package/dist/core/SignalProcessor.js +555 -0
  239. package/dist/core/SignalProcessor.js.map +1 -0
  240. package/dist/core/Step.d.ts +43 -32
  241. package/dist/core/Step.d.ts.map +1 -1
  242. package/dist/core/Step.js +220 -126
  243. package/dist/core/Step.js.map +1 -1
  244. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  245. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  246. package/dist/core/StreamingToolExecutor.js.map +1 -1
  247. package/dist/core/ToolManager.d.ts +44 -13
  248. package/dist/core/ToolManager.d.ts.map +1 -1
  249. package/dist/core/ToolManager.js +174 -91
  250. package/dist/core/ToolManager.js.map +1 -1
  251. package/dist/core/createAgent.d.ts +35 -0
  252. package/dist/core/createAgent.d.ts.map +1 -0
  253. package/dist/core/createAgent.js +36 -0
  254. package/dist/core/createAgent.js.map +1 -0
  255. package/dist/core/flow-namespace.d.ts +49 -0
  256. package/dist/core/flow-namespace.d.ts.map +1 -0
  257. package/dist/core/flow-namespace.js +168 -0
  258. package/dist/core/flow-namespace.js.map +1 -0
  259. package/dist/index.d.ts +11 -14
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +9 -12
  262. package/dist/index.js.map +1 -1
  263. package/dist/providers/GeminiProvider.d.ts +3 -3
  264. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  265. package/dist/providers/GeminiProvider.js +16 -14
  266. package/dist/providers/GeminiProvider.js.map +1 -1
  267. package/dist/types/agent.d.ts +183 -54
  268. package/dist/types/agent.d.ts.map +1 -1
  269. package/dist/types/agent.js +0 -6
  270. package/dist/types/agent.js.map +1 -1
  271. package/dist/types/ai.d.ts +3 -3
  272. package/dist/types/ai.d.ts.map +1 -1
  273. package/dist/types/errors.d.ts +15 -0
  274. package/dist/types/errors.d.ts.map +1 -0
  275. package/dist/types/errors.js +18 -0
  276. package/dist/types/errors.js.map +1 -0
  277. package/dist/types/flow.d.ts +513 -0
  278. package/dist/types/flow.d.ts.map +1 -0
  279. package/dist/types/flow.js +5 -0
  280. package/dist/types/flow.js.map +1 -0
  281. package/dist/types/index.d.ts +7 -6
  282. package/dist/types/index.d.ts.map +1 -1
  283. package/dist/types/index.js +4 -1
  284. package/dist/types/index.js.map +1 -1
  285. package/dist/types/persistence.d.ts +11 -7
  286. package/dist/types/persistence.d.ts.map +1 -1
  287. package/dist/types/routing.d.ts +1 -1
  288. package/dist/types/routing.d.ts.map +1 -1
  289. package/dist/types/session.d.ts +24 -23
  290. package/dist/types/session.d.ts.map +1 -1
  291. package/dist/types/signals.d.ts +248 -0
  292. package/dist/types/signals.d.ts.map +1 -0
  293. package/dist/types/signals.js +10 -0
  294. package/dist/types/signals.js.map +1 -0
  295. package/dist/types/template.d.ts +2 -8
  296. package/dist/types/template.d.ts.map +1 -1
  297. package/dist/types/tool.d.ts +36 -29
  298. package/dist/types/tool.d.ts.map +1 -1
  299. package/dist/types/tool.js +1 -1
  300. package/dist/types/tool.js.map +1 -1
  301. package/dist/utils/condition.d.ts +7 -1
  302. package/dist/utils/condition.d.ts.map +1 -1
  303. package/dist/utils/condition.js.map +1 -1
  304. package/dist/utils/id.d.ts +13 -5
  305. package/dist/utils/id.d.ts.map +1 -1
  306. package/dist/utils/id.js +22 -9
  307. package/dist/utils/id.js.map +1 -1
  308. package/dist/utils/index.d.ts +2 -2
  309. package/dist/utils/index.d.ts.map +1 -1
  310. package/dist/utils/index.js +2 -2
  311. package/dist/utils/index.js.map +1 -1
  312. package/dist/utils/session.d.ts +44 -5
  313. package/dist/utils/session.d.ts.map +1 -1
  314. package/dist/utils/session.js +193 -37
  315. package/dist/utils/session.js.map +1 -1
  316. package/docs/README.md +15 -202
  317. package/docs/concepts/architecture.md +281 -0
  318. package/docs/concepts/directives.md +400 -0
  319. package/docs/concepts/pipeline.md +399 -0
  320. package/docs/guides/branching.md +263 -0
  321. package/docs/guides/compaction.md +163 -0
  322. package/docs/guides/conditions.md +167 -0
  323. package/docs/guides/error-handling.md +176 -0
  324. package/docs/guides/flow-control.md +409 -0
  325. package/docs/guides/instructions.md +210 -0
  326. package/docs/guides/persistence.md +182 -0
  327. package/docs/guides/streaming.md +137 -0
  328. package/docs/migration/README.md +15 -0
  329. package/docs/migration/route-to-flow.md +560 -0
  330. package/docs/migration/v1-to-v2.md +909 -0
  331. package/docs/reference/adapters.md +481 -0
  332. package/docs/reference/branches.md +241 -0
  333. package/docs/reference/create-agent.md +186 -0
  334. package/docs/reference/directive.md +243 -0
  335. package/docs/reference/errors.md +122 -0
  336. package/docs/reference/flow.md +238 -0
  337. package/docs/reference/instruction.md +177 -0
  338. package/docs/reference/pre-directive.md +131 -0
  339. package/docs/reference/providers.md +227 -0
  340. package/docs/reference/signals.md +356 -0
  341. package/docs/reference/step.md +339 -0
  342. package/docs/reference/tool.md +269 -0
  343. package/docs/start/01-install.md +81 -0
  344. package/docs/start/02-first-agent.md +196 -0
  345. package/docs/start/03-collect-data.md +222 -0
  346. package/docs/start/04-add-tools.md +276 -0
  347. package/docs/start/05-go-to-production.md +216 -0
  348. package/examples/01-quickstart.ts +20 -0
  349. package/examples/02-data-extraction.ts +90 -0
  350. package/examples/03-tools.ts +136 -0
  351. package/examples/04-instructions.ts +100 -0
  352. package/examples/05-branching.ts +140 -0
  353. package/examples/06-flow-control.ts +103 -0
  354. package/examples/07-streaming.ts +69 -0
  355. package/examples/08-persistence.ts +98 -0
  356. package/examples/09-signals.ts +144 -0
  357. package/examples/tsconfig.json +30 -0
  358. package/package.json +2 -1
  359. package/src/adapters/MemoryAdapter.ts +3 -3
  360. package/src/adapters/MongoAdapter.ts +3 -3
  361. package/src/adapters/OpenSearchAdapter.ts +10 -8
  362. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  363. package/src/adapters/PrismaAdapter.ts +6 -6
  364. package/src/adapters/RedisAdapter.ts +3 -3
  365. package/src/adapters/SQLiteAdapter.ts +31 -12
  366. package/src/constants/index.ts +2 -10
  367. package/src/core/Agent.ts +585 -374
  368. package/src/core/AutoChainExecutor.ts +440 -0
  369. package/src/core/BranchEvaluator.ts +167 -0
  370. package/src/core/DirectiveBus.ts +248 -0
  371. package/src/core/DirectiveChainTracker.ts +144 -0
  372. package/src/core/Flow.ts +666 -0
  373. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  374. package/src/core/PersistenceManager.ts +8 -8
  375. package/src/core/PromptComposer.ts +209 -140
  376. package/src/core/PromptSectionCache.ts +1 -1
  377. package/src/core/ResponseEngine.ts +61 -46
  378. package/src/core/ResponseModal.ts +1458 -1241
  379. package/src/core/ResponsePipeline.ts +675 -173
  380. package/src/core/SignalEvaluator.ts +420 -0
  381. package/src/core/SignalProcessor.ts +723 -0
  382. package/src/core/Step.ts +279 -176
  383. package/src/core/StreamingToolExecutor.ts +4 -4
  384. package/src/core/ToolManager.ts +200 -97
  385. package/src/core/createAgent.ts +40 -0
  386. package/src/core/flow-namespace.ts +219 -0
  387. package/src/index.ts +42 -36
  388. package/src/providers/GeminiProvider.ts +17 -15
  389. package/src/types/agent.ts +182 -53
  390. package/src/types/ai.ts +3 -3
  391. package/src/types/errors.ts +18 -0
  392. package/src/types/flow.ts +590 -0
  393. package/src/types/index.ts +43 -16
  394. package/src/types/persistence.ts +12 -8
  395. package/src/types/routing.ts +1 -1
  396. package/src/types/session.ts +26 -23
  397. package/src/types/signals.ts +321 -0
  398. package/src/types/template.ts +3 -11
  399. package/src/types/tool.ts +50 -42
  400. package/src/utils/condition.ts +13 -4
  401. package/src/utils/id.ts +27 -9
  402. package/src/utils/index.ts +6 -2
  403. package/src/utils/session.ts +238 -42
  404. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  405. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  406. package/dist/cjs/core/BatchExecutor.js +0 -861
  407. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  408. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  409. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  410. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  411. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  412. package/dist/cjs/core/Route.d.ts +0 -180
  413. package/dist/cjs/core/Route.d.ts.map +0 -1
  414. package/dist/cjs/core/Route.js +0 -542
  415. package/dist/cjs/core/Route.js.map +0 -1
  416. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  417. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  418. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  419. package/dist/cjs/types/route.d.ts +0 -336
  420. package/dist/cjs/types/route.d.ts.map +0 -1
  421. package/dist/cjs/types/route.js.map +0 -1
  422. package/dist/core/BatchExecutor.d.ts +0 -359
  423. package/dist/core/BatchExecutor.d.ts.map +0 -1
  424. package/dist/core/BatchExecutor.js +0 -856
  425. package/dist/core/BatchExecutor.js.map +0 -1
  426. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  427. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  428. package/dist/core/BatchPromptBuilder.js +0 -219
  429. package/dist/core/BatchPromptBuilder.js.map +0 -1
  430. package/dist/core/Route.d.ts +0 -180
  431. package/dist/core/Route.d.ts.map +0 -1
  432. package/dist/core/Route.js +0 -538
  433. package/dist/core/Route.js.map +0 -1
  434. package/dist/core/RoutingEngine.d.ts +0 -185
  435. package/dist/core/RoutingEngine.d.ts.map +0 -1
  436. package/dist/core/RoutingEngine.js.map +0 -1
  437. package/dist/types/route.d.ts +0 -336
  438. package/dist/types/route.d.ts.map +0 -1
  439. package/dist/types/route.js +0 -5
  440. package/dist/types/route.js.map +0 -1
  441. package/docs/CONTRIBUTING.md +0 -521
  442. package/docs/api/README.md +0 -3299
  443. package/docs/api/overview.md +0 -1410
  444. package/docs/architecture/data-extraction-flow.md +0 -360
  445. package/docs/architecture/multi-step-execution.md +0 -277
  446. package/docs/core/agent/README.md +0 -938
  447. package/docs/core/agent/context-management.md +0 -796
  448. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  449. package/docs/core/agent/session-management.md +0 -693
  450. package/docs/core/ai-integration/prompt-composition.md +0 -355
  451. package/docs/core/ai-integration/providers.md +0 -515
  452. package/docs/core/ai-integration/response-processing.md +0 -433
  453. package/docs/core/conversation-flows/data-collection.md +0 -772
  454. package/docs/core/conversation-flows/route-dsl.md +0 -509
  455. package/docs/core/conversation-flows/routes.md +0 -249
  456. package/docs/core/conversation-flows/step-transitions.md +0 -731
  457. package/docs/core/conversation-flows/steps.md +0 -268
  458. package/docs/core/error-handling.md +0 -830
  459. package/docs/core/persistence/adapters.md +0 -255
  460. package/docs/core/persistence/session-storage.md +0 -656
  461. package/docs/core/routing/intelligent-routing.md +0 -470
  462. package/docs/core/tools/enhanced-tool.md +0 -186
  463. package/docs/core/tools/streaming-execution.md +0 -161
  464. package/docs/core/tools/tool-definition.md +0 -970
  465. package/docs/core/tools/tool-scoping.md +0 -819
  466. package/docs/guides/advanced-patterns/publishing.md +0 -186
  467. package/docs/guides/context-compaction.md +0 -96
  468. package/docs/guides/error-handling-patterns.md +0 -578
  469. package/docs/guides/getting-started/README.md +0 -795
  470. package/docs/guides/migration/README.md +0 -101
  471. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  472. package/docs/guides/migration/multi-step-execution.md +0 -393
  473. package/docs/guides/migration/response-modal-refactor.md +0 -518
  474. package/docs/guides/prompt-optimization.md +0 -164
  475. package/examples/advanced-patterns/context-compaction.ts +0 -223
  476. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  477. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  478. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  479. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  480. package/examples/ai-providers/anthropic-integration.ts +0 -388
  481. package/examples/ai-providers/openai-integration.ts +0 -228
  482. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  483. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  484. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  485. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  486. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  487. package/examples/conversation-flows/completion-transitions.ts +0 -318
  488. package/examples/core-concepts/basic-agent.ts +0 -503
  489. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  490. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  491. package/examples/core-concepts/session-management.ts +0 -494
  492. package/examples/integrations/database-integration.ts +0 -631
  493. package/examples/integrations/healthcare-integration.ts +0 -595
  494. package/examples/integrations/search-integration.ts +0 -530
  495. package/examples/integrations/server-session-management.ts +0 -307
  496. package/examples/persistence/custom-adapter.ts +0 -526
  497. package/examples/persistence/database-persistence.ts +0 -583
  498. package/examples/persistence/memory-sessions.ts +0 -495
  499. package/examples/persistence/prisma-schema.example.prisma +0 -74
  500. package/examples/persistence/redis-persistence.ts +0 -488
  501. package/examples/tools/basic-tools.ts +0 -765
  502. package/examples/tools/data-enrichment-tools.ts +0 -593
  503. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  504. package/examples/tools/streaming-tool-execution.ts +0 -283
  505. package/src/core/BatchExecutor.ts +0 -1187
  506. package/src/core/BatchPromptBuilder.ts +0 -299
  507. package/src/core/Route.ts +0 -678
  508. 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 };