@falai/agent 1.2.7 → 2.0.0

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