@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,731 +0,0 @@
1
- # Step Transitions & Conditional Logic
2
-
3
- The step transition system provides intelligent conversation flow control, enabling dynamic, context-aware progression through conversation routes. Unlike linear chatbots, this system can skip irrelevant steps, enforce dependencies, and adapt to user context.
4
-
5
- ## Overview
6
-
7
- Step transitions handle:
8
-
9
- - **Conditional Skipping**: Skip steps based on collected data or context
10
- - **Dependency Enforcement**: Ensure prerequisite data exists before proceeding
11
- - **Branch Resolution**: Handle multiple possible next steps
12
- - **Route Completion**: Detect when routes reach their end
13
- - **Loop Prevention**: Avoid infinite traversal in complex flows
14
-
15
- ## Stopping Conditions in Batch Execution
16
-
17
- When executing multiple steps in a batch, the engine stops for specific reasons indicated by the `stoppedReason` field in the response.
18
-
19
- ### StoppedReason Values
20
-
21
- | Reason | Description | Behavior |
22
- |--------|-------------|----------|
23
- | `needs_input` | Step requires data not yet available | Batch stops, LLM generates response to collect data |
24
- | `end_route` | Reached END_ROUTE marker | Route is complete, no more steps to execute |
25
- | `route_complete` | All steps in route processed | Route finished successfully |
26
- | `max_steps_reached` | Batch hit the `maxStepsPerBatch` limit | Batch stops, remaining steps execute in subsequent calls |
27
- | `prepare_error` | Error in prepare hook | Batch stops, error returned with last successful state |
28
- | `llm_error` | Error during LLM call | Batch stops, session state preserved |
29
- | `validation_error` | Data validation failed | Batch continues, errors included in response |
30
- | `finalize_error` | Error in finalize hook | Non-fatal, logged and execution continues |
31
-
32
- ### Needs-Input Stopping
33
-
34
- The most common stopping condition. A step needs input when:
35
-
36
- ```typescript
37
- // Step needs input if requires fields are missing
38
- const step1 = {
39
- prompt: "Confirm your booking",
40
- requires: ["hotel", "date"], // Both must be present
41
- };
42
-
43
- // Step needs input if collecting and no collect fields have data
44
- const step2 = {
45
- prompt: "What's your preference?",
46
- collect: ["preference", "notes"], // Needs input if BOTH are missing
47
- };
48
- ```
49
-
50
- ### End-Route Stopping
51
-
52
- Batch stops when reaching the END_ROUTE marker:
53
-
54
- ```typescript
55
- const finalStep = confirmStep.nextStep({
56
- prompt: "Booking confirmed! Anything else?",
57
- }).endRoute(); // Creates END_ROUTE transition
58
-
59
- // Response will have:
60
- // stoppedReason: "end_route"
61
- // isRouteComplete: true
62
- ```
63
-
64
- ### Route-Complete Stopping
65
-
66
- When all steps have been processed without hitting END_ROUTE:
67
-
68
- ```typescript
69
- // If the last step has no transitions and doesn't need input
70
- const response = await agent.respond("Complete my booking");
71
-
72
- // Response will have:
73
- // stoppedReason: "route_complete"
74
- // isRouteComplete: true
75
- ```
76
-
77
- ### Transitions Within Batched Execution
78
-
79
- During batch execution, transitions work as follows:
80
-
81
- 1. **Linear transitions** - Steps connected via `nextStep()` are evaluated sequentially
82
- 2. **SkipIf evaluation** - Each step's `skipIf` is checked before inclusion
83
- 3. **Needs-input check** - If a step needs input, batch stops there
84
- 4. **END_ROUTE detection** - Batch stops when reaching route end
85
-
86
- ```typescript
87
- // Example: Steps A → B → C → END_ROUTE
88
- // If user provides data for A and B but not C:
89
-
90
- const response = await agent.respond("Data for A and B");
91
-
92
- // Batch includes: [A, B]
93
- // Stops at: C (needs_input)
94
- // Next call will continue from C
95
- ```
96
-
97
- ### Error Stopping Conditions
98
-
99
- Errors during batch execution have different behaviors:
100
-
101
- ```typescript
102
- // Prepare hook error - stops immediately
103
- const stepWithPrepare = {
104
- prompt: "Processing...",
105
- prepare: async (context, data) => {
106
- if (!data.valid) throw new Error("Invalid data");
107
- },
108
- };
109
- // stoppedReason: "prepare_error"
110
- // Session state: last successful state preserved
111
-
112
- // LLM error - stops with preserved state
113
- // stoppedReason: "llm_error"
114
- // Session state: preserved from before LLM call
115
-
116
- // Validation error - continues but reports error
117
- // stoppedReason: "validation_error"
118
- // Collected data: partial data preserved
119
-
120
- // Finalize hook error - logged, continues
121
- // stoppedReason: original reason (not changed)
122
- // Error: included in response for logging
123
- ```
124
-
125
- ### Checking Stop Reason in Response
126
-
127
- ```typescript
128
- const response = await agent.respond("Book a hotel");
129
-
130
- switch (response.stoppedReason) {
131
- case 'needs_input':
132
- console.log("Waiting for user input");
133
- break;
134
- case 'max_steps_reached':
135
- console.log("Batch limit reached, more steps pending");
136
- break;
137
- case 'end_route':
138
- case 'route_complete':
139
- console.log("Route finished:", response.isRouteComplete);
140
- break;
141
- case 'prepare_error':
142
- case 'llm_error':
143
- console.error("Error occurred:", response.error);
144
- break;
145
- case 'validation_error':
146
- console.warn("Validation issues:", response.error);
147
- break;
148
- }
149
- ```
150
-
151
- ## Conditional Skipping
152
-
153
- ### SkipIf Logic
154
-
155
- The `skipIf` function determines whether a step should be bypassed:
156
-
157
- ```typescript
158
- const smartRoute = agent
159
- .createRoute({
160
- title: "Smart Onboarding",
161
-
162
- initialStep: {
163
- prompt: "What's your name?",
164
- collect: ["name"],
165
- skipIf: (data) => data.name !== undefined, // Skip if name already collected by any route
166
- },
167
- })
168
- .nextStep({
169
- prompt: "What's your email, {{name}}?",
170
- collect: ["email"],
171
- requires: ["name"], // Must have name from agent data to proceed
172
- skipIf: (data) => data.email !== undefined, // Skip if email already collected by any route
173
- });
174
- ```
175
-
176
- ### Common SkipIf Patterns
177
-
178
- ```typescript
179
- // Skip based on user preferences
180
- skipIf: (data) => data.skipNewsletterSignup === true;
181
-
182
- // Skip if data already exists
183
- skipIf: (data) => data.userProfile?.completed === true;
184
-
185
- // Skip based on external conditions
186
- skipIf: (data) => {
187
- const now = new Date();
188
- const lastContact = data.lastContactDate;
189
- return lastContact && now - lastContact < 24 * 60 * 60 * 1000; // Within 24 hours
190
- };
191
-
192
- // Skip based on user type
193
- skipIf: (data) => data.userType === "premium" && data.onboardingComplete;
194
- ```
195
-
196
- ## Dependency Enforcement
197
-
198
- ### Requires Validation
199
-
200
- The `requires` array ensures prerequisite data exists:
201
-
202
- ```typescript
203
- const dependentRoute = agent
204
- .createRoute({
205
- title: "Dependent Collection",
206
-
207
- initialStep: {
208
- prompt: "What's your name?",
209
- collect: ["name"],
210
- },
211
- })
212
- .nextStep({
213
- prompt: "What's your email address?",
214
- collect: ["email"],
215
- requires: ["name"], // Cannot proceed without name
216
- })
217
- .nextStep({
218
- prompt: "Should I send updates to {{email}}?",
219
- collect: ["emailConsent"],
220
- requires: ["name", "email"], // Needs both name and email
221
- });
222
- ```
223
-
224
- ### Complex Requirements
225
-
226
- ```typescript
227
- const complexRequirements = {
228
- prompt: "Let's schedule your appointment.",
229
- collect: ["appointmentDate", "appointmentTime"],
230
- requires: [
231
- "name", // Basic info
232
- "email", // Contact info
233
- "serviceType", // What service they want
234
- "availability", // When they're available
235
- ],
236
- skipIf: (data) => {
237
- // Skip if appointment already scheduled
238
- return data.appointmentId !== undefined;
239
- },
240
- };
241
- ```
242
-
243
- ## Step Traversal Logic
244
-
245
- ### Candidate Step Algorithm
246
-
247
- The system uses a sophisticated algorithm to find valid next steps:
248
-
249
- ```typescript
250
- // 1. Start with current step's direct transitions
251
- const transitions = currentStep.getTransitions();
252
-
253
- // 2. For each transition, evaluate:
254
- for (const transition of transitions) {
255
- // Check for END_ROUTE marker
256
- if (transition.id === END_ROUTE_ID) {
257
- return { isRouteComplete: true };
258
- }
259
-
260
- // Skip steps that should be skipped
261
- if (transition.shouldSkip(data)) {
262
- // Recursively traverse to find next valid step
263
- continue;
264
- }
265
-
266
- // Check if step has required data
267
- if (!transition.hasRequires(data)) {
268
- // Step cannot be entered yet
269
- continue;
270
- }
271
-
272
- // Found valid step
273
- return { step: transition };
274
- }
275
- ```
276
-
277
- ### Recursive Traversal
278
-
279
- For complex flows with skipIf conditions:
280
-
281
- ```typescript
282
- // Example flow: A -> B -> C -> END
283
- // If user has already completed B, skip to C
284
- // If B and C are complete, route is done
285
-
286
- const flow = agent
287
- .createRoute({
288
- title: "Complex Flow",
289
-
290
- initialStep: {
291
- /* Step A */
292
- },
293
- })
294
- .nextStep({
295
- prompt: "Step B content",
296
- skipIf: (data) => data.stepBComplete,
297
- })
298
- .nextStep({
299
- prompt: "Step C content",
300
- skipIf: (data) => data.stepCComplete,
301
- requires: ["stepBComplete"],
302
- })
303
- .endRoute();
304
- ```
305
-
306
- ## Branching Logic
307
-
308
- ### Branch Evaluation
309
-
310
- When multiple branches exist, the system evaluates each:
311
-
312
- ```typescript
313
- const branchingRoute = agent
314
- .createRoute({
315
- title: "Multi-Path Flow",
316
-
317
- initialStep: {
318
- prompt: "What type of help do you need?",
319
- collect: ["helpType"],
320
- },
321
- })
322
- .branch([
323
- {
324
- name: "technical",
325
- step: {
326
- prompt: "Technical support question?",
327
- collect: ["techIssue"],
328
- requires: ["helpType"],
329
- when: "if helpType indicates technical issue",
330
- },
331
- },
332
- {
333
- name: "billing",
334
- step: {
335
- prompt: "Billing question?",
336
- collect: ["billingIssue"],
337
- requires: ["helpType"],
338
- when: "if helpType indicates billing issue",
339
- },
340
- },
341
- {
342
- name: "general",
343
- step: {
344
- prompt: "General question?",
345
- collect: ["generalQuestion"],
346
- requires: ["helpType"],
347
- // No 'when' condition - fallback branch
348
- },
349
- },
350
- ]);
351
- ```
352
-
353
- ### Branch Resolution
354
-
355
- ```typescript
356
- // The routing engine evaluates branches and selects the best path
357
- // 1. Check explicit 'when' conditions (AI-evaluated)
358
- // 2. Fall back to branches without conditions
359
- // 3. Allow multiple branches if no clear winner
360
-
361
- // Access specific branches for chaining
362
- const techBranch = branchingRoute.branches.technical.nextStep({
363
- prompt: "Let me help with that technical issue...",
364
- requires: ["techIssue"],
365
- });
366
- ```
367
-
368
- ## Route Completion
369
-
370
- ### End Route Detection
371
-
372
- Routes complete when reaching END_ROUTE:
373
-
374
- ```typescript
375
- const completeRoute = agent
376
- .createRoute({
377
- title: "Task Completion",
378
-
379
- initialStep: { prompt: "What task?", collect: ["task"] },
380
- })
381
- .nextStep({
382
- prompt: "I'll help with {{task}}",
383
- requires: ["task"],
384
- })
385
- .nextStep({
386
- prompt: "Task details?",
387
- collect: ["details"],
388
- requires: ["task"],
389
- })
390
- .endRoute({
391
- prompt: "Task completed! Anything else?",
392
- collect: ["satisfaction"], // Optional final collection
393
- });
394
- ```
395
-
396
- ### Completion Handlers
397
-
398
- ```typescript
399
- const routeWithCompletion = agent.createRoute({
400
- title: "Workflow",
401
-
402
- // Simple string transition
403
- onComplete: "feedback-route",
404
-
405
- // Or conditional transition
406
- // onComplete: {
407
- // nextStep: "success-route",
408
- // condition: "if workflow succeeded"
409
- // }
410
-
411
- // Or dynamic transition
412
- // onComplete: async (session, context) => {
413
- // if (session.data?.success) return "success-route";
414
- // return "retry-route";
415
- // }
416
- });
417
- ```
418
-
419
- ## Advanced Transition Patterns
420
-
421
- ### Circular Flows
422
-
423
- Handle repeating patterns with proper termination:
424
-
425
- ```typescript
426
- const iterativeRoute = agent
427
- .createRoute({
428
- title: "Iterative Collection",
429
-
430
- initialStep: {
431
- prompt: "Add an item (or 'done' to finish)",
432
- collect: ["currentItem"],
433
- },
434
- })
435
- .nextStep({
436
- prompt: "Item added: {{currentItem}}. Add another?",
437
- collect: ["continue"],
438
- requires: ["currentItem"],
439
- skipIf: (data) => data.continue === false || data.currentItem === "done",
440
- })
441
- .nextStep({
442
- prompt: "Add another item?",
443
- collect: ["currentItem"],
444
- requires: ["continue"],
445
- // Loops back to previous step
446
- });
447
- ```
448
-
449
- ### State-Based Transitions
450
-
451
- ```typescript
452
- const statefulRoute = agent
453
- .createRoute({
454
- title: "State Machine",
455
-
456
- initialStep: {
457
- prompt: "What's your current status?",
458
- collect: ["status"],
459
- },
460
- })
461
- .branch([
462
- {
463
- name: "new",
464
- step: {
465
- prompt: "Welcome! Let's get you started.",
466
- collect: ["onboardingData"],
467
- when: "if status is 'new'",
468
- skipIf: (data) => data.status !== "new",
469
- },
470
- },
471
- {
472
- name: "returning",
473
- step: {
474
- prompt: "Welcome back! What can I help with?",
475
- collect: ["request"],
476
- when: "if status is 'returning'",
477
- skipIf: (data) => data.status !== "returning",
478
- },
479
- },
480
- ]);
481
- ```
482
-
483
- ## Lifecycle Integration
484
-
485
- ### Prepare and Finalize Hooks
486
-
487
- ```typescript
488
- const hookedRoute = agent
489
- .createRoute({
490
- title: "Lifecycle Demo",
491
-
492
- initialStep: {
493
- prompt: "Starting process...",
494
- prepare: async (context, data) => {
495
- // Setup before AI responds
496
- console.log("Preparing step with context:", context);
497
- console.log("Current data:", data);
498
- },
499
- finalize: async (context, data) => {
500
- // Cleanup after AI responds
501
- console.log("Step completed with data:", data);
502
- await saveProgress(data);
503
- },
504
- },
505
- })
506
- .nextStep({
507
- prompt: "Process step...",
508
- prepare: (context, data) => {
509
- // Validate state before proceeding
510
- if (!data.requiredField) {
511
- throw new Error("Missing required field");
512
- }
513
- },
514
- });
515
- ```
516
-
517
- ### Route-Level Hooks
518
-
519
- ```typescript
520
- const routeWithHooks = agent.createRoute({
521
- title: "Route Lifecycle",
522
-
523
- hooks: {
524
- onDataUpdate: (newData, previousData) => {
525
- // Validate data changes across the route
526
- if (newData.criticalField && !isValid(newData.criticalField)) {
527
- throw new Error("Invalid critical field");
528
- }
529
- return newData;
530
- },
531
-
532
- onContextUpdate: (newContext, previousContext) => {
533
- // React to context changes
534
- console.log("Route context updated");
535
- },
536
- },
537
- });
538
- ```
539
-
540
- ## Error Handling & Recovery
541
-
542
- ### Transition Validation
543
-
544
- ```typescript
545
- const robustRoute = agent
546
- .createRoute({
547
- title: "Error Handling",
548
-
549
- initialStep: {
550
- prompt: "What would you like to do?",
551
- collect: ["action"],
552
- finalize: async (context, data) => {
553
- try {
554
- await validateAction(data.action);
555
- } catch (error) {
556
- // Set error state for recovery
557
- data.actionError = error.message;
558
- data.needsRecovery = true;
559
- }
560
- },
561
- },
562
- })
563
- .nextStep({
564
- prompt:
565
- "There was an issue with your request: {{actionError}}. Please try again.",
566
- collect: ["action"],
567
- skipIf: (data) => !data.needsRecovery,
568
- finalize: (context, data) => {
569
- // Clear error state on successful retry
570
- delete data.actionError;
571
- delete data.needsRecovery;
572
- },
573
- });
574
- ```
575
-
576
- ### Recovery Patterns
577
-
578
- ```typescript
579
- const recoveryRoute = agent
580
- .createRoute({
581
- title: "Recovery Flow",
582
-
583
- // Normal flow
584
- initialStep: {
585
- /* normal steps */
586
- },
587
-
588
- // Recovery branch
589
- })
590
- .branch([
591
- {
592
- name: "normal",
593
- step: {
594
- /* normal processing */
595
- },
596
- },
597
- {
598
- name: "recovery",
599
- step: {
600
- prompt: "I encountered an error. Let's start over.",
601
- collect: ["resetConfirmation"],
602
- when: "if error state is detected",
603
- finalize: (context, data) => {
604
- // Reset problematic data
605
- resetSessionData(data);
606
- },
607
- },
608
- },
609
- ]);
610
- ```
611
-
612
- ## Performance Considerations
613
-
614
- ### Efficient Traversal
615
-
616
- ```typescript
617
- // The system optimizes by:
618
- // 1. Using visited sets to prevent infinite loops
619
- // 2. Early termination on END_ROUTE detection
620
- // 3. Lazy evaluation of skipIf conditions
621
- // 4. Caching of validation results
622
-
623
- // Example of efficient validation
624
- skipIf: (data) => {
625
- // Cache expensive operations
626
- if (data._skipCache === undefined) {
627
- data._skipCache = expensiveCheck(data);
628
- }
629
- return data._skipCache;
630
- };
631
- ```
632
-
633
- ### Memory Management
634
-
635
- ```typescript
636
- // Clean up temporary data
637
- finalize: (context, data) => {
638
- // Remove temporary fields
639
- delete data._tempField;
640
- delete data._skipCache;
641
-
642
- // Compress large data structures if needed
643
- if (data.largeArray?.length > 100) {
644
- data.largeArray = data.largeArray.slice(-50); // Keep recent items
645
- }
646
- };
647
- ```
648
-
649
- ## Debugging Transitions
650
-
651
- ### Step Inspection
652
-
653
- ```typescript
654
- // Inspect route structure
655
- console.log(route.describe());
656
-
657
- // Check step validity
658
- const step = route.getStep("step-id");
659
- console.log("Should skip:", step.shouldSkip(session.data));
660
- console.log("Has requirements:", step.hasRequires(session.data));
661
-
662
- // Get all transitions
663
- const transitions = step.getTransitions();
664
- console.log(
665
- "Available transitions:",
666
- transitions.map((s) => s.id)
667
- );
668
- ```
669
-
670
- ### Transition Tracing
671
-
672
- ```typescript
673
- // Enable debug logging
674
- const agent = new Agent({
675
- name: "Debug Agent",
676
- debug: true, // Enables transition logging
677
- provider: provider,
678
- });
679
-
680
- // Logs will show:
681
- // [RoutingEngine] Found valid step after skipping: step-3
682
- // [RoutingEngine] Route complete: all data collected, END_ROUTE reached
683
- // [Agent] Entered step: step-3
684
- ```
685
-
686
- ### Testing Transitions
687
-
688
- ```typescript
689
- // Test step conditions
690
- const testData = { name: "John", email: "john@test.com" };
691
-
692
- const shouldSkip = step.shouldSkip(testData);
693
- const hasRequirements = step.hasRequires(testData);
694
-
695
- console.log(`Step ${step.id}:`);
696
- console.log(`- Should skip: ${shouldSkip}`);
697
- console.log(`- Has requirements: ${hasRequirements}`);
698
- console.log(`- Can proceed: ${!shouldSkip && hasRequirements}`);
699
- ```
700
-
701
- ## Best Practices
702
-
703
- ### Transition Design
704
-
705
- 1. **Clear Dependencies**: Make `requires` relationships obvious
706
- 2. **Smart Skipping**: Use `skipIf` to avoid redundant interactions
707
- 3. **Fail Fast**: Validate early to prevent invalid states
708
- 4. **Recovery Paths**: Plan for error conditions and recovery flows
709
-
710
- ### Performance
711
-
712
- 1. **Efficient Conditions**: Cache expensive `skipIf` evaluations
713
- 2. **Minimal Dependencies**: Avoid overly complex requirement chains
714
- 3. **Early Termination**: Use END_ROUTE appropriately
715
- 4. **Memory Cleanup**: Remove temporary data in finalize hooks
716
-
717
- ### Maintainability
718
-
719
- 1. **Descriptive IDs**: Use meaningful step and route identifiers
720
- 2. **Documentation**: Comment complex transition logic
721
- 3. **Testing**: Cover edge cases in transition logic
722
- 4. **Monitoring**: Track transition success rates
723
-
724
- ### User Experience
725
-
726
- 1. **Natural Flow**: Make transitions feel conversational
727
- 2. **Context Preservation**: Maintain conversation context across steps
728
- 3. **Error Recovery**: Handle failures gracefully with clear recovery paths
729
- 4. **Progress Indication**: Show users where they are in multi-step processes
730
-
731
- The step transition system enables sophisticated conversation flows that can adapt to user context, handle complex branching logic, and maintain data integrity throughout multi-turn interactions.