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